#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char * argv [] ) {
int alloc = 10;
int i = 0;
int *array = (int *) malloc (alloc * sizeof(*array));
printf("Enter some integers, stops with EOF:\n");
while( 1 ) {
if( i > alloc - 1 ) {
alloc *= 2;
array = (int *) realloc (array, alloc * sizeof(*array));
}
if( scanf("%d", &array[i]) != 1 )
break;
i++;
}
if( ! feof(stdin) ) {
printf("Wrong input.\n");
return 1;
}
free(array);
return 0;
}
我想问一下使用realloc
的正确方法。
上面的代码工作正常。该阵列正在动态扩展 根据输入。
然而,我听说正确的方法是使用a 临时阵列,我想知道为什么以及如何做到这一点。
答案 0 :(得分:1)
int *temp;
temp = (int *) realloc (array, alloc * sizeof(*array)); }
if(temp == NULL){free(array);}
else{
array = temp;
//continue
}
在原始代码中:
array = (int *) realloc (array, alloc * sizeof(*array)); }
如果realloc失败array = NULL
。你失去了指针。你不能再free(array);
了。
答案 1 :(得分:0)
好吧原来的代码是错误的,因为我会失去指针,如Valter所说。
array = (int *) realloc (array, alloc * sizeof(*array)); } //wrong
但如果我尝试使用Valters代码,程序就会崩溃。见下面的评论。
int *temp;
temp = (int *) realloc (array, alloc * sizeof(*array)); } //Here ends body of condition
if(temp == NULL){free(array);} //for expanding array
else{ //Lets say we are in firts iteration. temp is not equal NULL
array = temp; //so we ran in the "else" where we try to asign temp to
//continue //array. But theres nothing in temp yet => Program crashes.
}
所以我对上面的代码做了一些改动,效果很好。
if( i > alloc - 1 ) {
alloc *= 2;
temp = (int *) realloc (array, alloc * sizeof(*array));
if( temp == NULL ) {
free(array);
printf("Error allocating memory.\n");
return 1; }
array = temp; //Now we have confidence that temp would not be empty or what so ever
} //Here ends body of condition for expanding array