c - "segmentation fault"将值分配给动态分配矩阵中的特定位置时

标签 c matrix segmentation-fault dynamic-memory-allocation

我这样做了很多次,但突然间我无法克服这个错误。我有一个具有以下结构的简单 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])

然后最好在访问之前检查读取的 rowcols 是否在 xy 的范围内那个位置。

您还应该检查 fscanf 的结果,而不是错误地使用 while(!feof(fp))。如果 fscanf 失败,您当前仍然尝试访问读取的数据,这是错误的。

关于c - "segmentation fault"将值分配给动态分配矩阵中的特定位置时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75220376/

相关文章:

c - 为什么要将函数参数复制到局部变量中?

c - 将分配的值存储到分配的数组

MATLAB:如何在连续 block 中按列计算数字频率

matlab - 将 3 维数组 reshape 为 2 维

python - 如何最有效地存储矩阵的值

c++ - 如何将 "this"的生命周期移动到 C++ 中的另一个对象中?

C - 枚举 - 定义

c - 如何使用循环打印多个最大值

c - pthread_cond_broadcast 被 dlsym 破坏了吗?

c - pthread_create 之后的段错误 (