关于free()函数 realloc()函数的问题 请高手指教

yimingxinshou 2011-11-05 06:48:36
例如:
char str[]="abcdef";
char *chars=str;
free(chars);
再如:
char *p;
p=(char*)malloc(50*sizeof(char));
.......
free(p);

这里的free()函数是释放了整个数组占用的空间还是只释放了第一个元素占用的空间?怎样把指针所指向的一整块空间通过free()函数释放?还有如果p指向的是一个链表,free(p)是只释放第一个结点的空间还是整个链表占用的空间都可以释放?能够说明一下free()函数原理的更好

还有realloc()函数的问题
例如:
char *p,*q;
p=(char*)malloc(50*sizeof(char));
......
q=(char*)realloc(p,100*sizeof(char));
realloc()函数是怎样实现的?

在原有空间(即p指向的空间)的基础上扩充空间后将原空间的元素复制到新开辟的空间(q指向的空间)里,结束后q指向的地址实际上还是p指向的地址。
还是
另外开辟一块儿指定大小的空间,将原有空间中的元素复制到新空间里,然后将原来的空间覆盖。
或者是通过其他方式实现? p和q指向的内存首地址是不是一个地方啊?请高手指教,越详细越好。
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yimingxinshou 2011-11-06
  • 打赏
  • 举报
回复
了解了,谢谢你们了
seucs 2011-11-06
  • 打赏
  • 举报
回复
char str[]="abcdef";
char *chars=str;
free(chars);
这种写法是错误的。free() 只能释放由 malloc()/realloc() 等对应函数申请到的空间,下面以malloc()为例。
函数库在malloc() 成功,返回其申请的地址块的首地址时,需要有一个链表来维护当前的地址空间使用状态的,如:
int *p = (int *)malloc(50*sizeof(int));
我们再深入看一下malloc的一种可能的实现方式
void *malloc(size_t nbytes)
{
// 使用某种内存分配策略查找当前维护的地址空间(一般是heap,即堆)
// 中 >= nbytes 的连续空闲地址块
// 找到后得到其首地址 addr,并将连续的nbytes标记为“已分配”,并修改使用链表
return addr;
}
即在malloc()函数返回前,会记录以返回地址 p 开始的连续nbytes个空间,当
free(p);
的时候,free() 函数的内部大概是如下方式
void free(void *ptr)
{
// 查找已分配链表中以 ptr 开始的分配节点
// 若找到,回收其节点中已记录的连续 nbytes 个空间,将其加入到未分配空间
// 若没找到,则出错或者什么也不做
}
所以malloc()/free() 要成对使用,不能将 new 出来的空间用 free来释放
suixinpiaodang 2011-11-06
  • 打赏
  • 举报
回复
free 只能释放由malloc realloc在堆上申请请的内存,,其他地方在程序运行完后有操作系统自己释放,,也就是说,free与malloc realloc实现对应的。
free所释放的内存大小是在本段中有malloc realloc申请的内存的大小。。释放的原理,我也不清楚。。

C语言函数realloc
函数简介
  原型:extern void *realloc(void *mem_address, unsigned int newsize);
  语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小不然的话会导致数据丢失!   
  功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。   返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。    注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放
WaistCoat07 2011-11-05
  • 打赏
  • 举报
回复
char str[]="abcdef";
char *chars=str;
free(chars);

这个写法是不对的,str是栈上分配的,不能用free。free释放的是堆上分配的内存,就是malloc和realloc申请的内存。
------------------------------------------------------------------------------------------------
free(p),释放p指向的内存。这个内存大小是有你前面的malloc和realloc决定的。
------------------------------------------------------------------------------------------------
realloc()函数是怎样实现的?
realloc分配的内存地址返回值可能是原指针,也可能是新指针。这取决于操作系统的实现。
如果原指针内存后面的内存没有别占用,则直接扩充。如果后面的内存小于你要扩充的内存,则重新分配一个新内存

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧