【问题标题】:Realloc Not Copying Old DataRealloc 不复制旧数据
【发布时间】:2016-02-17 01:05:54
【问题描述】:

背景:

我使用 calloc() 创建了一个数组,一切正常。然后我使用 realloc() 使数组更大。当我尝试访问数组中的元素时,它似乎只是创建了一个没有任何内容的新指针并调用运行时错误。

我的代码:

#include <stdio.h>

int main() {

  int *arr;

  for (int i = 0; i < 5; i++){
      if (i == 0) {
          if ((arr = (int *) calloc(1, sizeof(int))) == NULL) {
              printf("NO MORE SPACE TERMINATING PROGRAM");

              return NULL;
          }

      } else {
          int *tmp;

          if ((tmp = (int *)realloc(arr, 4*sizeof(int)) == NULL)){
              printf("NO MORE SPACE TERMINATING PROGRAM");
          }

          arr = tmp;
      }

      arr[i] = i;
  }
}

当 i = 1 时,它会在 arr[i]=i; 行上引发运行时错误;

当我在arr = temp; 上方添加断点 1 行时,它显示 temp 完全为空白。

为什么会这样?

--------更新----

感谢大家的帮助。这是有效的更新代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int *arr = NULL;

    for (int i = 0; i < 5; i++){
        int *tmp;

        if ((tmp = realloc(arr, (i+1) * sizeof(int))) == NULL){
            printf("NO MORE SPACE TERMINATING PROGRAM");
        }

        arr = tmp;

        arr[i] = i;
    }

    for (int i = 0; i < 5; i++) {
        printf("%i",arr[i]);
    }
}

输出为:01234

感谢大家的帮助。

【问题讨论】:

  • 你没有#include &lt;stdlib.h&gt;,这正是你不应该转换malloccallocrealloc的结果的原因。此外,arr[4] 是 4 之外的一个元素 realloc(3 是您可以使用 4 元素数组寻址的最大索引)。
  • 与您的问题无关,但如果您最初使用 int *arr = NULL;,则 i == 0 的情况是多余的。重新分配空指针是安全的,在这种情况下它的行为与malloc 相同。
  • 另外,就风格而言,for (i = 0; ___; i++) { if (i == 0) {....} 在循环开始之前只需添加 {....} 块会更清楚地写出

标签: c arrays dynamic-memory-allocation realloc calloc


【解决方案1】:

始终注意警告。这样做会显示:

warning: assignment makes pointer from integer without a cast [enabled by default]
           if ((tmp = (int *)realloc(arr, 4*sizeof(int)) == NULL)){

这告诉您编译器将int 分配给tmp。这怎么可能?如果你仔细看,你会发现括号不正确。实际上,它将realloc(arr, 4*sizeof(int)) == NULL 的结果分配给tmp。正确的代码如下。请注意括号在作业周围的位置。

if ((tmp = realloc(arr, 4*sizeof(int))) == NULL)

而您缺少#include &lt;stdlib.h&gt;callocrealloc 的定义。

更新:正如 M.M 和其他人所建议的,即使上述问题已修复,realloc 仍然不正确,因为它只分配 4 个元素,而 for 循环将访问 5 个元素。因此需要将4 更改为5i+1 例如。而且即使它不会导致任何功能问题,也没有必要在 0 之后的每个循环上都 realloc

【讨论】:

  • 提一下4 还不够;也许(i+1) 会更好
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2017-02-19
  • 2014-08-26
相关资源
最近更新 更多