malloc和relloc函数的作用和其注意事项

malloc

malloc和relloc函数都需要头文件 <stdlib.h>.

malloc函数模型:void *malloc(size_t size);

malloc 会在堆上分配连续的空间。堆中空间没用名字,只能用指针使用。malloc函数返回的值没有类型(void*),需要按照开辟的需求强制转换成相应的类型。

用free()函数来释放malloc开辟的空间,free操作仅仅是释放堆上空间的使用权,并不会改变接受malloc返回地址的指针的指向。

同一块内存空间不能被多出释放。当释放完空间后,一定要将指针(p)设为NULL。再操作 free(p) 时,编译器不在报错。

原因:在进入free函数时,函数内部会先判断p的值,p=NULL直接返回,不继续执行free函数里面的操作命令.

实例:

#include <stdio.h>
#include <stdlib.h>


int main()
{
	int a;
	
	int * p = (int *)malloc(sizeof(int)*10);
	if (p == NULL)
	{
		printf ("内存分配失败\n");
		return -1;
	}
	printf ("%p\n", p);//设输出p = 0x2000
	free(p);
	// free(p)--二次释放报错
	printf ("%p\n", p);	//p = 0x2000
	
	// 当释放完空间以后,一定要将指针设为NULL
	p = NULL;
	
	//不再报错
	free(p);
	free(p);
	return 0;
}	

relloc

relloc()函数用来更改已经配置的空间。

函数模型:   void *realloc(void *ptr, size_t size);   ptr为原地址,size为重新分配需要的内存大小

扩大一块内存时,realloc()试图直接从堆上当前内存段后面的字节中获取更多的内存空间,如果满足则返回原指针。当后面的

存不够时,则在堆上找到第一个能满足内存要求的内存块,将目前的数据复制到新的位置,将原先的数据块释放返回新的地址。

如果剩余内存不足,重新申请空间失败,则返回NULL。

在接受relloc的返回值时需要一个新的指针变量来接受,不能用原先的指针接受新地址。如果重申失败,原指针接受为NULL,realloc失败原数据块没有释放,原先内存发生内存泄漏, 如果继续对原指针进行操作则会崩溃。(不能对NULL进行任何操作

实例

int main()
{
	int a;
	
	int * p = (int *)malloc(sizeof(int)*10);
	if (p == NULL)
	{
		printf ("内存分配失败\n");
		return -1;
	}
	
   // p = (int *)realloc(p, sizeof(int)*20);错误:原指针接受relloc的返回值
	
	int *tmp = (int *)realloc(p, sizeof(int)*20);
	
	
	if (tmp == NULL)
	{
		printf ("重新分配内存失败\n");
		return -1;
	}
	
	p = tmp;
	printf ("p = %p, tmp = %p\n", p, tmp);
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值