使用realloc或临时数组

时间:2014-01-24 00:17:22

标签: c realloc temporary

#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 临时阵列,我想知道为什么以及如何做到这一点。

2 个答案:

答案 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