【问题标题】:Initializing the memory using realloc()使用 realloc() 初始化内存
【发布时间】:2019-06-20 03:07:16
【问题描述】:

关于realloc()的问题。

如果我想扩大我之前用realloc() 分配的内存。

额外的内存是否会像calloc()一样初始化为0?

第二个问题是:

    int * p =(int*)malloc(10*sizeof(int));
    int* s = (int*)realloc(p,20);
    p=s;

s 分配给p 是调整指针p 大小的好方法吗?

我们可以realloc()calloc()分配的内存吗?

【问题讨论】:

  • 手册是怎么说的?
  • 除了the casting 和缺乏错误检查,看起来几乎就像它应该的样子。不,额外的内存不会被初始化。您可能想检查例如this realloc reference
  • 哦,您的重新分配实际上分配了 shrink 分配的内存。您传递给realloc 的大小是要分配的 大小(以字节为单位)。

标签: c memory realloc


【解决方案1】:

额外的内存会被初始化为0吗?

没有。

我们可以realloc()calloc()分配的内存吗?

是的。

s 分配给p 是调整指针p 大小的好方法

视情况而定。

只是在做

int * p = malloc(...);
int * s = realloc(p, ...);
p = s;

一样
int * p = malloc(...);
p = realloc(p, ...);
int * s = p;

在这两种情况下,如果realloc() 失败(并返回NULL),原始内存的地址就会丢失。

但是做

int * p = malloc(...);

{
  int * s = realloc(p, ...); /* Could use a void* here as well. */
  if (NULL == s)
  {
     /* handle error */
  }
  else
  {
    p = s;
  }
}

realloc() 的故障具有鲁棒性。即使在失败的情况下,原始内存仍然可以通过p 访问。

请注意,如果realloc() 成功,传入的指针值不一定再指向任何有效内存。 不要读取它,也不要读取指针值本身,因为在这两种情况下这样做都可能引发未定义的行为。

【讨论】:

  • @xing:为什么?我们没有上下文。所以现在的代码是正确的。
  • 因为在上下文中,我想将 p 从 10*sizeof(int) 调整为 20*sizeof(int)。
  • @Liu:你的问题没有提到这个。
  • 反正没关系。
  • 我不明白第一个和最后一个括号。如果 realloc() 失败了,我可以读取我传递给它的指针吗???
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2021-01-14
  • 2019-11-24
  • 2014-11-19
  • 2012-09-01
  • 1970-01-01
相关资源
最近更新 更多