gpt4 book ai didi

c - Realloc 不复制旧数据

转载 作者:行者123 更新时间:2023-12-04 11:04:33 28 4
gpt4 key购买 nike

背景:

我使用 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)){

这告诉您编译器正在分配 inttmp .这怎么可能?如果你仔细看,你会发现括号是不正确的。实际上,它分配了 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 个元素。所以需要改变45i+1例如。即使它不会导致任何功能问题,也没有必要 realloc在 0 之后的每个循环上。

关于c - Realloc 不复制旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33726813/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com