关于free 函数操作问题

为准确了解free函数,让我们看看malloc申请动态内存和free函数被调用时,内存做了哪些工作:

int main()
{
	int *arr=(int*)malloc(10*sizeof(int));
	arr[0] = 100;
	arr[1] = 200;

	free(arr);
	arr = NULL;

	char src[]={"shit man"};
	char *str = (char*)malloc(10);
	strcpy(str,src);

	free(str);
	str = NULL;
	return 0;
}



申请40个字节的内存块大小为28,在被申请内存块首地址的16字节之前被写入;

调用free函数后,之前申请的内存块被覆盖;


接着申请10个字节大小的内存块,转成16进制为0a,在内存块首地址的16字节之前被写入到内存里;

使用free函数释放内存时,函数在内存块首地址之前16个字节处找到内存块的大小。

因此若被free的为一个空指针是没有任何意义的,编译器也不会报错。


申请字符串函数,初始化遇到问题

char* ArrChar()
{
	char *arr = (char*)malloc(10*sizeof(char));

	return arr;
}

int main()
{
	char *p=ArrChar();
	free(p);
	
	return 0;
}


由于未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是取随机值,使用strcpy函数,可以进行正确的初始化。


如果内存不够的情况,函数库为我们提供了另一个函数realloc,

int main()
{
	int *p = (int*)malloc(10*sizeof(int));
	for(int i=0; i<10; i++)
	{
		p[i]=i;
	}
	
	int tmp = 0;

	p = (int*)realloc(p,100*sizeof(int));
	for(int i=0; i<20; i++)
	{
		p[i]=i;
	}

	tmp = 1;

	p = (int*)realloc(p,5*sizeof(int));
	for(int i=0; i<5; i++)
	{
		p[i]=i;
	}
	return 0;
}

监视p 的地址为

动态申请长度为40字节的内存

使用realloc函数,得到长度为400字节的内存,p的地址仍为

调用realloc函数,得到新的长度为20字节的内存,p的地址为



本次测试realloc函数申请更大或更小内存,指针的位置均为发生改变,原来的内存已经被覆盖。


参考文献:

free函数是如何确定要释放多少内存空间的

http://www.cnblogs.com/xxNote/p/4009359.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值