Practice
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i=0,z=2;
char *p=(char *)calloc(z,(sizeof(char)));
if(!(p)){
printf("\nMemory NOT Enough\n");
goto END;
}
*p='V';
z+=2;
p=realloc(p,z*(sizeof(char))); ----A
*(p+3)='S';
for(i=0;i<z;++i)
printf("\n%d\n",p[i]);
END:free(p);p=NULL;
return 0;
}如您所见,A标记的行使用realloc。
在line A中,=的LHS上的p被分配给realloc(p,z*(sizeof(char)));生成的新地址。
我的问题是:
以前在p中存储的地址发生了什么变化?以前存储的地址被替换了,那么它会导致内存泄漏吗?
发布于 2014-08-25 07:42:00
如果来自realloc()的返回值为NULL,则一切正常;如果realloc()返回NULL,则会出现内存泄漏。
您需要使用帮助器变量来安全地使用realloc()。
char *tmp;
tmp = realloc(p, z);
if (tmp == NULL) {
fprintf(stderr, "Unable to realloc.\n");
// p still points to the old memory and its contents are valid
exit(EXIT_FAILURE); // or some other error recovery
} else {
// tmp points to a (possibly new) block of memory with the same contents
// as what p used to point to (to the maximum of the old size and z)
// p (very probably) points to an invalid address
p = tmp; // now p points to a valid address (also tmp)
// ignore tmp for now on
}发布于 2014-08-25 07:29:24
不,这个内存由realloc负责,如果realloc找到足够的内存附加到p,那么它的if,否则realloc会将内存移动到新的location.note,从而释放旧的内存。
发布于 2014-08-25 07:30:01
只有当堆中有足够的内存可用时,realloc才会尝试扩展可用内存范围。
来自C标准:
https://stackoverflow.com/questions/25480930
复制相似问题