【发布时间】: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 <stdlib.h>,这正是你不应该转换malloc、calloc或realloc的结果的原因。此外,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