① c语言如何申请内存
1.calloc
=
2malloc
+
memset
3与4是连续的,但是他们方式不一样,3你是通过new出来的和malloc一样,它申请的堆中的内存,需要手动释放。而4char
t[10]如果你是在函数里用到就是在栈里申请的,出函数会自动释放,如果是在文件开头的全局变量那就是在静态存储区
就这点区别
② c语言中,如何申请较大的内存空间
用malloc应该可以的吧
再不行,用静态的,如p[512*1024*1024]
声明成全局的,因为局部变量在栈中,栈没有这么大
③ C语言中如何动态增加内存空间
有一个malloc函数,专门用来进行动态内存管理的
④ C语言 如果用malloc 申请一块内存,但执行的时候发现它不够用了,怎么在给这块内存扩充大小呢
用realloc可以重新分配空间
⑤ 用C语言分配开辟内存问题
你的代码不是C的,其实现在语言比较强大,也许在内存回收上做了完善,我不会C++,我知道JAVA语言,他本身在内存回收上面做了优化,就是在堆中申请的内存,操作系统没回收,但JAVA语言最终编译成可运行码的时候,回收了这块内存(JAVA的垃圾回收机制,蛮强的,不过我不太喜欢)。你可以试试用C写,用malloc 来申请,这个应该不会被回收的,你可以试试,当然可能和其它原因有关。
最后如果你想学习内存管理的话,方向是:操作系统理论中的页式内存管理,地址的印射这2部分是理论(比较简单,实际情况比这复杂一点,先看理论比较好)
等真的明白了(应该不难懂),下面就有难度了,选一个比较流行的CPU的地址映射(各种不同的CPU地址映射是不一样的),我看的是intel 80386后出现的保护模式(其实是286后出现的,不过286没什么名气),以及linux中内存管理的源代码(记得结合书看,直接看代码很难懂)。
==========================================
你的问题算是有点难度和深度的。
关于内存开辟问题,在linux中有个很特殊的内存段,它的大小是8K,我们叫他系统堆栈空间,任何一段程序代码在运行时候它都是一个进程,它都会有这么一个8K的系统堆栈空间。局部变量都是放在这样一个8K空间中,包括int a,int a[100], int *a.他们都放在这里。
那么第一个问题就回答了,int a就是放在系统堆栈空间中。当这个进程死亡的时候,会有其它的进程来回收这个空间(它自己会指定的,一般是其父进程),所以你不需要自己手动去释放局部变量占地内存。
至于int * a;然后你new一个空间这个就有点不同了,首先 * a还是个局部变量,他是存在于系统堆栈中。不过它存的比较特殊是一个逻辑地址,不是一个值(其实逻辑地址也就是一个无符号的16位整数而已)。当你new 的时候,会在堆空间中开一个空间,并把这个空间的地址放到刚那个 a中去。很明显新申请的空间不是在系统堆栈空间中,父进程(一般是)是不会回收这个内存的,这就是为什么你要自己 free(a) 这样来释放空间。
我们常说局部变量不要过大,比如int a[10000]这是不允许的,可以看出来只有8K的大小的内存,而且他还不全部都是给局部变量使用,他有相当一部分内存是给进程控制块和中断返回现场用的(读过linux源代码你就清楚了),另外C语言不检查数组边界,如果你int a[4]数组,而不顾一切的向这个数组上放东西,你就有可能很运气的把中断的返回地址给冲掉,聪明的人会放一个新的返回地址进去,而这个地址返回一个恶意的进程。知道会发生什么了,这就是缓冲区溢出攻击。
windows虽然不太一样,但原理差不多。
⑥ c语言求修改,内存一直在增加。
for(i=0;i<m;m++){
p[i]=(int*)malloc(sizeof(int)*n);
}
改成
for(i=0;i<m;i++){
p[i]=(int*)malloc(sizeof(int)*n);
}
⑦ c语言动态数组如何扩充空间
c语言动态数组扩充空间,主要是利用动态存储分配库函数来实现的,常用的有malloc函数和calloc函数。
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
例如:
char *x;
x = (char *)malloc(10); //x就指向了包含10个字符单元的存储空间。
(7)c语言增加内存扩展阅读:
函数定义
其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
⑧ c语言分配内存方式有哪些
内存分配方式有三种:
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
⑨ c语言 分配超大内存
用文件内存映射,这样系统就会把文件作为内存使用,文件有多大你虚拟出来的内存就有多大
⑩ C语言 随着读取内容的扩大分配更多的内存
文件大小是指文件里面内容所占的字节数。
可以边读取边分配。
用struct比较好,
typedef struct
{
double num1;
double num2;
char str[48];
}st_data;