我这样做了很多次,但突然间我无法克服这个错误。我有一个具有以下结构的简单 input.txt 文件:
3 4
2 1 1
1 2 3
8 3 3
其中第一行基本上是矩阵的大小,然后是每行的值行列。我正在使用 calloc,因此矩阵设置为 0,然后读取文件,替换值及其位置。正是在 readFile() 函数中,我得到“段错误”,我猜当它尝试替换矩阵中的值时。 因此,我想要得到的是:
2 0 0 0
0 0 1 0
0 0 8 0
void readSize(FILE *fp, int *rows, int *cols) {
fscanf(fp, "%d %d", rows, cols);
}
void readFile (FILE *fp, int **A) {
int val, row, col;
val = row = col = 0;
char buffer[100];
fgets(buffer, 100, fp); //* skip first line
while(!feof(fp)) {
fscanf(fp, "%d %d %d", &val, &row, &col);
A[row][col] = val;
val = row = col = 0;
}
}
int **allocMatrix(int m, int n) {
int **A = (int** )calloc(m, sizeof(int* ));
for( int i = 0; i < m; i++) *(A + i) = (int* )calloc(n, sizeof(int));
if (A == NULL) {
handleErr(ALLOC_ERR);
free(A);
}
return A;
}
int main() {
FILE *fp = fopen(INPUT, "r");
if (fp == NULL) handleErr(READ_FILE_ERR);
int **A, m, n; //! m -> rows | n -> cols
readSize(fp, &m, &n);
A = allocMatrix(m, n);
readFile(fp, A);
fclose(fp);
printMatrix(A, m, n);
return 0;
}
最佳答案
该代码有几个小错误。您专门寻找的错误似乎是 A[row][col] = val;
。由于您已经分配了大小为 3x4 的指针表,因此您无法访问该数组中的数组项 [3][3]
,因为数组在 C 中是 0 索引的。您的输入文件显示为 1 -索引。
将代码重写为使用正确的二维数组的一种方法是这样的:
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;
}
您也可以重写其他函数来处理二维数组,例如:
void readFile (FILE *fp, int x, int y, int A[x][y])
然后最好在访问之前检查读取的 row
和 cols
是否在 x
和 y
的范围内那个位置。
您还应该检查 fscanf
的结果,而不是错误地使用 while(!feof(fp))
。如果 fscanf
失败,您当前仍然尝试访问读取的数据,这是错误的。
关于c - "segmentation fault"将值分配给动态分配矩阵中的特定位置时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75220376/