关于realloc的问题

[复制链接]
查看11 | 回复1 | 2010-9-18 12:56:17 | 显示全部楼层 |阅读模式
下面是我在百科里面复制的一段讲realloc的DEMO
#include
#include
int main()
{ int i;
int *pn=(int *)malloc(5*sizeof(int));
printf("%p\n",pn);
for(i=0;i<5;i++)
scanf("%d",&pn);
*******************************
pn=(int *)realloc(pn,10*sizeof(int));
printf("%p\n",pn); for(i=0;i<5;i++)
printf("%3d",pn);
printf("\n");
free(pn);
return 0;
}
我觉得 在*******处应该加一段:q=pn。
不然当返回值为的时候,以前pn的内容不是丢了?
资料上是这么说的:返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
如果现在分配不成功,那么(int *)realloc(pn,10*sizeof(int))的值就是NULL,pn=(int *)realloc(pn,10*sizeof(int));这个复制语句,这样的话,pn不是NULL了。那现在我又要用原来pn指向的内容怎么办?

回复

使用道具 举报

千问 | 2010-9-18 12:56:17 | 显示全部楼层
LZ理解有误。对于realloc而言,它负责重新分配给定指针指向的由malloc等动态方式获得的内存空间,而不是仅仅是新申请空间然后复制原内容。从设计目的来说,旧的空间如果需要被释放,过程和结果应该是安全的,因此一个典型的简单实现中realloc内部成功地新申请空间、复制原内存空间中的数据后,会把原来那一片内存free掉(这样以前的内容也确实丢了,但更进一步,由于通过free归还给了系统,用指针指回这片空间是无意义的),于是这里就不用事先q = pn了,用了一般也是错的(这取决于realloc的实现,如果新分配内存比较小或者之后有连续的空闲空间可供扩大原来被分配的内存块,理论上可以不另外申请新空间进行复制,而在原地取某一偏移量直接进行free,此时re
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行