版权声明:欢迎转载,注明来源!https://blog.csdn.net/weixin_42572273 https://blog.csdn.net/weixin_42572273/article/details/85332059
通常在程序在编译中有几个区域:代码区,数据区,堆区,栈区;
栈区的空间由编译器自动申请和释放,通常存储各函数的局部变量,参数值和临时变量; 而堆中的内存需要程序设计人员调用内存调整函数来分配和释放。
1. malloc()内存申请函数
函数原型:void * __cdecl malloc( size_t _Size);
参数说明:_Size为无符号整型,大小为申请的内存字节数
举个栗子:分配十个整型空间,字节数为sizeof(int)*10
#include<stdio.h>
int main()
{
int *p = (int *)malloc(sizeof(int)* 10);
int *Address=p;
free(p);
return 0;
}
说明:
- malloc()函数返回的是void类型的指针,调用时需要强制转换为自己需要的类型
- malloc()返回的指针需要妥善保存,不能丢失;否则在释放时指针丢失首地址,导致所分配空间无法释放(解决方案有两种,一是如上程序,申请后用一个新指针保存首地址;而是将分配后的地址不要移动,时始终指向所分配内存的首地址)
- 在使用完空间后一定要调用free()函数释放所分配的空间,不然会造成内存泄漏
2. realloc()内存调整函数
函数原型: void * realloc(void * _Memory, size_t _NewSize);
参数说明: _Memory是原指针; _NewSize为无符号整型,大小为调整后的内存字节数(不是追加的内存字节数)
举例:调整上面的10个整型空间为20个
#include<stdio.h>
int 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为内存元素的类型长度;
举例:
#include<stdio.h>
int 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设置为数组的容量.
几种特殊情况的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);//仍有空间,上越界与下越界相连