内存申请和内存调整函数malloc(),realloc(),calloc()用法

版权声明:欢迎转载,注明来源!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调整后的内存

说明:

  • 使用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函数与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);//仍有空间,上越界与下越界相连
注意区别realloc(ip,0)和realloc(NULL,0)

猜你喜欢

转载自blog.csdn.net/weixin_42572273/article/details/85332059