背景:
我使用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;
上面添加一个断点时,它显示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 <stdlib.h>
,这就是为什么你不应该强制转换malloc
、calloc
或realloc
的结果的原因。另外,arr[4]
超出了你重新分配的 4 个元素的范围(3 是用 4 个元素的数组可以访问的最大索引)。 - Kninnugint *arr = NULL;
,那么i == 0
情况是多余的。重新分配空指针是安全的,并且在这种情况下它的行为与malloc
相同。 - M.Mfor (i = 0; ___; i++) { if (i == 0) {....}
更清晰的写法是将{....}
块放在循环开始之前。 - M.M