通常在程序在编译中有几个区域:代码区,数据区,堆区,栈区; 栈区的空间由编译器自动申请和释放,通常存储各函数的局部变量,参数值和临时变量; 而堆中的内存需要程序设计人员调用内存调整函数来分配和释放。 1. malloc()内存申请函数
函数原型:void * __cdecl malloc( size_t _Size);
参数说明:_Size为无符号整型,大小为申请的内存字节数
举个栗子:分配十个整型空间,字节数为sizeof(int)*10
#includeint main(){int *p = (int *)malloc(sizeof(int)* 10);int *Address=p;free(p);return 0;}
说明: malloc()函数返回的是void类型的指针,调用时需要强制转换为自己需要的类型malloc()返回的指针需要妥善保存,不能丢失;否则在释放时指针丢失首地址,导致所分配空间无法释放(解决方案有两种,一是如上程序,申请后用一个新指针保存首地址;而是将分配后的地址不要移动,时始终指向所分配内存的首地址)在使用完空间后一定要调用free()函数释放所分配的空间,不然会造成内存泄漏实际中对malloc执行后要判断是否申请成功。 2. realloc()内存调整函数
函数原型: void * realloc(void * _Memory,活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看 size_t _NewSize);
参数说明: _Memory是数据源指针; _NewSize为无符号整型,大小为调整后的内存字节数(不是追加的内存字节数)
举例:调整上面的10个整型空间为20个
#includeint main(){int *p = (int *)malloc(sizeof(int)* 10);int *tmp_p = (int *)realloc(p, sizeof(int)* 20);if (NULL != tmp_p){p = tmp_p;}else{printf(\”追加内存失败!\”);}free(p);return 0;}
说明: 使用realloc()增加空间不一定会成功,当追加的空间较大时,后续没有足够的空间时,则重新开辟空间,若再次开辟失败,则会出现内存泄露(原空间没有被释放)和数据丢失(原先指针不再指向原空间,而在失败时被赋为NULL)
解决办法
:
将新开辟的空间指向一个新地址。当成功时将原地址指向新地址,防止数据丢失和内存泄露注意_Size参数为扩增后的总空间,而不是追加的空间 3. calloc()
函数原型:void * calloc(size_t _Count,size_t _Size);
参数说明: _Count和_Size都是无符号整型,_Count为申请所存储的元素个数,_Size为内存元素的类型长度;
举例:
#includeint main(){int *p = (int *)calloc(10,sizeof(int));if (NULL == p){printf(\”内存申请失败!\”);}else{int *Address = p;}free(p);return 0;}
说明: 注意 calloc函数与malloc函数的区别,同样是在堆上开辟空间,calloc会对开辟的空间初始化为0;malloc则不会;即可这样理解calloc(n,size)=malloc(nsize)+memset(p,0,nsize);其余应注意的操作和malloc函数一样!calloc函数适合为数组申请空间,可以将_Size设置为数组元素的空间长度,将_Count设置为数组的容量. 4.free函数
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。例如你用free( p )释放了内存空间后,原来指向这块空间的指针还是存在!此时原本指向刚刚释放掉了空间的指针p仍然指向了该内存空间,这样一旦这段内存已经被别的变量使用的话,就可能误用p来修改这里的值,这不是我们所期望的,所以free§之后一定要将p = NULL;这样就万无一失了。
几种特殊情况的malloc函数和reallo函数
int ip = (int)malloc(sizeof(int)* 5);//指针保存好,不能移动,否则在释放时指针丢失首地址,导致所分配空间无法释放
ip = (int*)realloc(ip, sizeof(int)* 100);//增加,有可能失败
ip = (int*)realloc(ip, sizeof(int)* 2);// 减少时,缩小内存空间
ip = (int*)realloc(ip,0);//调整空间为0,相当于free(ip);ip=NULL;操作
ip = (int*)realloc(NULL, sizeof(int)* 10);//相当于malloc(sizeof(int)* 10)
ip = (int*)realloc(NULL, 0);//仍有空间,上越界与下越界相连
《malloc函数从哪里申请内存,malloc函数申请的内存在哪里分配》来自互联网同行内容,若有侵权,请联系我们删除!
还没有评论,来说两句吧...