Realloc 不复制旧数据

Joe*_*oel 3 c arrays realloc calloc dynamic-memory-allocation

背景:

我使用 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

arr[i]=i;当 i = 1 时,它在线上抛出运行时错误;

当我在上面添加断点 1 行时,arr = temp;它显示 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:01234

感谢大家的帮助。

kay*_*lum 5

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

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

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

if ((tmp = realloc(arr, 4*sizeof(int))) == NULL)
Run Code Online (Sandbox Code Playgroud)

和你错过#include <stdlib.h>了的定义callocrealloc

更新:正如 MM 和其他人所建议的那样,即使上面是固定的,realloc仍然不正确,因为它只分配了 4 个元素,而for循环将访问 5 个元素。因此需要更改45i+1例如。即使它不会导致任何功能问题,也没有必要realloc在 0 之后的每个循环上执行。