无法在C中为动态创建的数组添加1个以上的值

时间:2017-04-04 14:06:05

标签: c arrays memory malloc dynamic-arrays

我正在尝试在C中创建一个动态增加的数组,但由于某种原因,我无法将值分配给除数组的第一个元素之外的任何内容。当代码运行时,temp的值不断变化,但val的内容只是一个地址和列表中第一个float的值。有任何想法吗?提前谢谢!

//Initialise variables.
char buf[20]={0};
float temp=0;
int i=0;

//Create the initial array.
size_t size = sizeof(float)*10;
float* val = malloc(size);
if (val == NULL) {
    fprintf(stderr, "Initial malloc failed\n");
    exit(1);
}

//Open the file (a list of floats).
FILE *file;
file = fopen("/Users/cc756/Dropbox/C_ECG_PROJECT/ECG_Project/ECG_Project/dataStream", "r");

if (!file){
    printf("Coulding find file.\n");
    exit(1);
}

//Save the contents of the list to a float array.
while (fgets(buf,20, file)!=NULL){
    temp = atof(buf);
    if (temp != 0){
        val[i] = temp;
        i++;
        if(i==size){
            size *= 2;
            float* val_temp = realloc(val,size);
            if(val_temp == NULL){
                printf("Realloc failed.\n");
            }
            else{
                val = val_temp;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我认为你的意思是

if ( i == size / sizeof( float ) ){

也是循环的逻辑

while (fgets(buf,20, file)!=NULL){
    temp = atof(buf);
    if (temp != 0){
        val[i] = temp;
        i++;
        if(i==size){
            size *= 2;
            float* val_temp = realloc(val,size);
            if(val_temp == NULL){
                printf("Realloc failed.\n");
            }
            else{
                val = val_temp;
            }
        }
    }
}
如果val_temp被分配NULL因为i被增加而且在循环的下一次迭代中这个陈述

,则

是错误的

val[i] = temp;

导致未定义的行为。

答案 1 :(得分:0)

所以,有几件事......

如果使用size来跟踪数组中元素的数量,而不是数组的字节大小,那么生命将变得更加简单。相信我。

size_t size = 10;
float *val = malloc( size * sizeof *val );

此外,在您确定size来电成功之前,请不要更新realloc的值:

if ( i == size )
{
  float *val_temp = realloc( val, (size * 2) * sizeof *val );
  if ( val_temp )
  {
    size *= 2;
    val = val_temp;
  }
  else
  {
    // handle realloc failure
  }
}

为什么呢?您可能认为realloc失败并非致命,并且返回您目前所读的内容 - 在这种情况下,您希望size准确反映您拥有的内容。

至于解决当前问题,我建议添加一些debug printf语句:

while( ... )
{
  ...
  fprintf( stderr, "i = %d\n", i );
  fprintf( stderr, "size = %zu\n", size );
  fprintf( stderr, "val = %p\n", (void *) val );
  fprintf( stderr, "val[%d] = %f\n\n", i, val[i] ); 
  ...
}

通过这种方式,您可以准确地看到循环的每次迭代都具有的内容。