首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"calloc“和"realloc”

使用"calloc“和"realloc”
EN

Stack Overflow用户
提问于 2014-08-25 07:26:41
回答 3查看 822关注 0票数 1

Practice

代码语言:javascript
复制
#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中存储的地址发生了什么变化?以前存储的地址被替换了,那么它会导致内存泄漏吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-25 07:42:00

如果来自realloc()的返回值为NULL,则一切正常;如果realloc()返回NULL,则会出现内存泄漏。

您需要使用帮助器变量来安全地使用realloc()

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2014-08-25 07:29:24

不,这个内存由realloc负责,如果realloc找到足够的内存附加到p,那么它的if,否则realloc会将内存移动到新的location.note,从而释放旧的内存。

票数 1
EN

Stack Overflow用户

发布于 2014-08-25 07:30:01

只有当堆中有足够的内存可用时,realloc才会尝试扩展可用内存范围。

来自C标准:

  • 尺寸== 0
    • realloc可能释放旧的,并返回0。
    • 或者,realloc的行为与大小相同!= 0,但不能返回0。

  • 大小!= 0
    • realloc可能返回0。老不动
    • 如果old指向的块是>=大小,realloc可能会返回old
    • 或者,realloc分配一个块>=大小,将所有字节从旧复制到大小,释放旧字节并返回这个新块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25480930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档