C语言 Matrix GDB项目中的分段错误问题

ac1kyiln  于 2023-02-18  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在为一个类做GDB项目,我发现一段代码中的segfault部分有问题,这段代码读取一个文件,并使用输入创建一个矩阵。GDB将我带到"printf(" %.2d\t ",mat [row][col]);",但我似乎无法掌握到底出了什么问题。

int main(int argc, char* argv[])
{
   FILE* fp = fopen(argv[1], "r");
   int size = 0;
   int **mat = readFile(fp, &size);
   printMatrix(mat, size);
   return 0;
}
int** readFile(FILE* fp, int *size)
{
    fscanf(fp, "%d", size);
    int num = *size;
    int index = 0;
    
    int** mat = (int**)malloc(num * sizeof(int));
    for(index = 0; index < num; index++)
        mat[index] = (int*)malloc(num * sizeof(int)); 

    int row = 0;
    int col = 0;
    for(; row < num; row++)
    {
        for(; col < num; col++)
        {
            fscanf(fp, "%d", &mat[row][col]);
        }
    }
    return mat;
}

void printMatrix (int** mat, int num)
{
    int row = 0;
    int col = 0;
    for(row = 0; row < num; row++)
    {
        for(col = 0; col < num; col++)
        {
            printf("%.2d\t", mat[row][col]);   /* gdb indicates segfault here */
        }
        printf("\n");
    }
}

我尝试修改for循环,但似乎无法获得预期的输出。

63lcw9qa

63lcw9qa1#

int** mat = (int**)malloc(num * sizeof(int));

应该是

int** mat = malloc(num * sizeof(int *));

或更好

int** mat = malloc(num * sizeof(*mat));

对于非int的大小,也使用site_t
我个人会使用指向数组的指针而不是指针数组来消除一级间接性(难以(取消)/分配,性能损失)
始终检查mallocscanf的结果

void *readFile(FILE* fp, size_t *size)
{
    if(fscanf(fp, "%d", size) != 1) { /* handle  error */}
    int (*mat)[*size] = malloc(*size * sizeof(*mat));
    if(mat)
    {
        for(size_t row = 0; row < *size; row++)
        {
            for(size_t col = 0; col < *size; col++)
            {
                if(fscanf(fp, "%d", &mat[row][col]) != 1) { /* handle  error */}
            }
        }
    }
    return mat;
}

void printMatrix (size_t num, int (*mat)[num])
{
    if(mat)
    {
        for(size_t row = 0; row < num; row++)
        {
            for(size_t col = 0; col < num; col++)
            {
                printf("%.2d\t", mat[row][col]);   /* gdb indicates segfault here */
            }
            printf("\n");
        }
    }
}

相关问题