gpt4 book ai didi

c - 使用 "calloc"和 "realloc"

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:28 26 4
gpt4 key购买 nike

练习

#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

A 行 中,= 的 LHS 上的 p 被分配了由 realloc(p,z *(sizeof(char)));.

我的问题是:

p 中先前存储的地址会发生什么变化?之前存储的地址被替换了,会不会导致内存泄露?

最佳答案

如果 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
}

关于c - 使用 "calloc"和 "realloc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25480930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com