我正在尝试在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;
}
}
}
}
答案 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] );
...
}
通过这种方式,您可以准确地看到循环的每次迭代都具有的内容。