【问题标题】:what will be the result if i reallocating the calloc pointer?如果我重新分配 calloc 指针会有什么结果?
【发布时间】:2017-03-25 18:00:58
【问题描述】:
int main()
{
  int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers
  ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers
  free(ptr);
  return 0;
}

最初ptr保持内存包含零,但新创建的内存包含零或垃圾值。

如果出现零,realloc 如何知道 ptr 是使用 malloc 或 calloc 创建的天气。

【问题讨论】:

  • 代码不正确。阅读realloc 的手册页(这也将回答您的问题)。您应该至少自己一些努力。
  • 哦,现在它是正确的。是时候更新我的答案了:)
  • 我必须说我很难理解。但由于 OP 实际上改进了拼写错误,我很乐意这样做。

标签: c dynamic-memory-allocation realloc


【解决方案1】:

即使你正确地调用了realloc(没有强制转换结果并将其分配回去,否则它不能正常工作):

ptr = realloc(ptr,20*sizeof(int));

(有些人可能会说这是不安全的,因为 realloc 可以返回 NULL 从而失去对 ptr 的引用)

它没有。它只是重新分配而不将其余部分设置为0

例如,您必须使用 memset 手动将剩余的内存设置为 0。

我愿意:

int *ptr_new = realloc(ptr,20*sizeof(int));
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ }
else
 {
    // set the end of memory to 0
    memset(ptr_new+10,0,sizeof(int)*10);
   ...

注意:一个常见的错误是realloc 的结果分配回去,因为它似乎可以工作,直到操作系统需要将内存移动到另一个块,在这种情况下您的 ptr 指针变得无效并且您有未定义的行为。

【讨论】:

  • 不会realloc 复制之前指针处的数据(尽可能多)?在这种情况下,0 将持续存在,最多与您之前的数量相同。
  • 但是如果我们在我们的ptr中包含一些数据,然后重新分配它,realloc会将数据复制到新的地方,对吗??
  • 是的,它们会持续存在,但不会超过之前分配的内存大小。
  • realloc 如果可以找到连续区域,则会尝试避免移动原始内存。如果没有,它会将现有内存移动到更大的区域。
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2010-12-16
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多