c - **矩阵的工作方式与矩阵[行][列]有何不同?

标签 c matrix dynamic

我在学习时正在做某事,遇到了下一个问题。 为了简化和缩短问题,我将代码精确地缩减为问题。

我想读取一个矩阵并将其输出到屏幕上。 但是当我运行这段代码时:

int main(){
    int in, jn, row, col, **mat;
    scanf("%d %d", &row, &col);
    mat = (int **) malloc(row * col * sizeof(int *));
    for(in = 0; in < col; in++){
        mat[in] = (int *) malloc((col + 1) * sizeof(int));
    }
    if(mat == NULL){
        printf("Error. Allocation was unsuccessful. \n");
        return 1;
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            scanf("%d", &mat[in][jn]);
        }
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            printf("%d ", mat[in][jn]);
        }
        printf("\n");
    }
    return 0;
}

我遇到段错误。我调试了程序,当 in = 2 和 jn = 0 时出现错误。所以我读到: 1 2 3 4 在这里,当我尝试读入 mat[2][0] 时,出现段错误。我不明白为什么。 The error

我这里有另一个版本:

int main(){
    int in, jn, row, col;
    scanf("%d %d", &row, &col);
    int mat[row][col];
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            scanf("%d", &mat[in][jn]);
        }
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            printf("%d ", mat[in][jn]);
        }
        printf("\n");
    }
    return 0;
}

这个问题是我看不到代码块中 watch 的值。对于 mat[0][0](例如),而不是矩阵的第一个元素,我看到“无法对不完整类型执行指针数学,请尝试转换为已知类型,或 void *。”

对我来说这是一种奇怪的行为,我不明白。 为什么我在第一个版本中出现段错误,为什么我在 watch 窗口中看不到矩阵?

最佳答案

类型 (*int) 的内存分配量已关闭。 您所需要的只是行数。 对于每一行,只需要类型 (int) 的列数。 这是数组和指针之间差异的链接。 link

 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>

 int main(){
    int in, jn, row, col, **mat;
    scanf("%d %d", &row, &col);
    mat = malloc(row * sizeof(int *));
    if(mat == NULL){
       printf("Error. Allocation was unsuccessful. \n");
       return 1;
     }
     for(in = 0; in < row; in++){
        mat[in] = malloc(col * sizeof(int));
        assert(mat[in]!=NULL);
     }
     for(in = 0; in < row; in++){
       for(jn = 0; jn < col; jn++){
          scanf("%d", &mat[in][jn]);
       }
     }
     for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
           printf("%d ", mat[in][jn]);
        }
        printf("\n");
     }
    return 0;
 }

关于c - **矩阵的工作方式与矩阵[行][列]有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812947/

相关文章:

android - Android 上的 LD_PRELOADING dlopen

java - 15, 11 汉明码发生器矩阵

Python:动态实例化

linq - 将字符串转换为 linq 查询

c - Linux:可以抢占信号处理程序的执行吗?

c - C语言函数返回字符串的方法

c - 如何从标准FILE结构获取文件名?

java - 数组中的元素

c - 程序 : what do these errors mean? 的总线错误/段错误

swift - 将文本大小设置为与最近通话联系人姓名相同的大小