【发布时间】:2016-12-26 02:01:33
【问题描述】:
我在将文件动态读取到二维数组时遇到问题。我已经阅读了很长时间,但我仍然不知道如何强制我的代码工作。
我的代码:http://codepaste.net/3hcbtn
#include <stdio.h>
#include <stdlib.h>
int main(){
//This program reads a file consisting of 5 columns of numbers.
//We assume that we don't know the number of rows of that file.
double **x,**t;
int i,j,COL=5;
x=malloc(COL*sizeof(double*));
for(i=0;i!=COL;i++){x[i]=calloc(1,sizeof(double));}
t=malloc(COL*sizeof(double*));
FILE *f;
f=fopen("realloc2.dat","r");
j=0;
for(;;){
for(i=0;i!=COL-1;i++){
fscanf(f,"%lf, ",&x[i][j]);
t[i]=realloc(x[i],sizeof(x[i]+1));
x[i]=t[i];
}
fscanf(f,"%lf\n",&x[COL-1][j]);
if(feof(f)!=0){break;}
t[COL-1]=realloc(x[COL-1],sizeof(x[COL-1]+1));
x[COL-1]=t[COL-1];
j++;
}
for(i=0;i!=COL;i++){
free(x[i]);
}
free(x);
free(t);
fclose(f);
return 0;
}
输出:
*** Error in `./realloc2_2': realloc(): invalid next size: 0x0000000001d9d040 ***
[...]
Segmentation fault
我有一个包含 COL 列的文件,但我们不知道它有多少行,这就是我尝试使用 realloc() 的原因。我花了很多时间试图修复它...你能帮帮我吗?
谢谢。
【问题讨论】:
-
您的代码中没有矩阵(又名二维数组),也没有可以用作一或指向一的东西。并查看How to Ask。
-
测试来自
fscanf()的返回值;如果输入中有一个字母,feof()会告诉你“不在 EOF”,但fscanf()不会读取值。您还应该检查您的内存分配。而realloc(x[COL-1],sizeof(x[COL-1]+1))中的sizeof()不返回条目数;它返回sizeof(double *)(给定double **x)。 C 不跟踪动态数组大小;您必须自己明确跟踪大小。循环:j = 0; for (;;) { …; j++; }应该写成for (j = 0; ; j++)假设在j上没有一个好的测试应该放在条件表达式槽中。
标签: c file malloc scanf realloc