C语言 在动态分配矩阵中为特定位置赋值时出现“分段错误”

j2cgzkjk  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(120)

我这样做了很多次,但突然我不能克服这个错误。我有一个简单的input.txt文件,其结构如下:

3 4
2 1 1
1 2 3
8 3 3

其中第一行基本上是矩阵的大小,然后每行都跟在value row col后面。我使用calloc,所以矩阵被设置为0,然后阅读文件,我替换值和它们的位置。正是在**readFile()**函数中,我得到了“segmentation fault",我猜是当它试图替换矩阵中的值时。因此,我试图得到的是:
x一个一个一个一个x一个一个二个x

rur96b6h

rur96b6h1#

这段代码有几个小错误。你要找的bug似乎是A[row][col] = val;。因为你分配了一个大小为3x4的指针表,你不能访问数组中的数组项[3][3],因为数组在C中是0索引的。你的输入文件似乎是1索引的。
一种将代码重写为使用正确的2D数组的方法如下所示:

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])

然后,理想情况下,在访问该位置之前,检查读取的rowcols是否在xy的边界内。
您还应该检查fscanf的结果,而不是错误地使用while(!feof(fp))。如果fscanf失败,您目前仍然尝试访问读取的数据,这是错误的。

相关问题