Realloc 不复制旧数据
Realloc Not Copying Old Data
背景:
我使用 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
感谢大家的帮助。
始终注意警告。这样做会显示:
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 <stdlib.h>
calloc
和 realloc
的定义。
更新:正如 M.M 和其他人所建议的那样,即使上面的内容是固定的,realloc
仍然不正确,因为它只分配了 4 个元素,而 for
循环将访问 5 个元素。例如,需要将 4
更改为 5
或 i+1
。即使它不会导致任何功能问题,也没有必要在 0.
之后的每个循环上 realloc
背景:
我使用 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
感谢大家的帮助。
始终注意警告。这样做会显示:
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 <stdlib.h>
calloc
和 realloc
的定义。
更新:正如 M.M 和其他人所建议的那样,即使上面的内容是固定的,realloc
仍然不正确,因为它只分配了 4 个元素,而 for
循环将访问 5 个元素。例如,需要将 4
更改为 5
或 i+1
。即使它不会导致任何功能问题,也没有必要在 0.
realloc