我这样做了很多次,但突然我不能克服这个错误。我有一个简单的input.txt文件,其结构如下:
3 4 2 1 1 1 2 3 8 3 3
其中第一行基本上是矩阵的大小,然后每行都跟在value row col后面。我使用calloc,所以矩阵被设置为0,然后阅读文件,我替换值和它们的位置。正是在**readFile()**函数中,我得到了“segmentation fault",我猜是当它试图替换矩阵中的值时。因此,我试图得到的是:x一个一个一个一个x一个一个二个x
rur96b6h1#
这段代码有几个小错误。你要找的bug似乎是A[row][col] = val;。因为你分配了一个大小为3x4的指针表,你不能访问数组中的数组项[3][3],因为数组在C中是0索引的。你的输入文件似乎是1索引的。一种将代码重写为使用正确的2D数组的方法如下所示:
A[row][col] = val;
[3][3]
readSize(fp, &m, &n); int (*A)[n+1] = allocMatrix(m,n); ... free(A);
将函数正确重写为:
void* allocMatrix(int m, int n) { int (*A)[n+1] = calloc( 1, sizeof(int[m+1][n+1]) ); if(A == NULL) { handleErr(ALLOC_ERR);; } return A; }
您也可以重写其他函数以使用2D数组,例如:
void readFile (FILE *fp, int x, int y, int A[x][y])
然后,理想情况下,在访问该位置之前,检查读取的row和cols是否在x和y的边界内。您还应该检查fscanf的结果,而不是错误地使用while(!feof(fp))。如果fscanf失败,您目前仍然尝试访问读取的数据,这是错误的。
row
cols
x
y
fscanf
while(!feof(fp))
1条答案
按热度按时间rur96b6h1#
这段代码有几个小错误。你要找的bug似乎是
A[row][col] = val;
。因为你分配了一个大小为3x4的指针表,你不能访问数组中的数组项[3][3]
,因为数组在C中是0索引的。你的输入文件似乎是1索引的。一种将代码重写为使用正确的2D数组的方法如下所示:
将函数正确重写为:
您也可以重写其他函数以使用2D数组,例如:
然后,理想情况下,在访问该位置之前,检查读取的
row
和cols
是否在x
和y
的边界内。您还应该检查
fscanf
的结果,而不是错误地使用while(!feof(fp))
。如果fscanf
失败,您目前仍然尝试访问读取的数据,这是错误的。