【问题标题】:Segmentation fault in int matrixint 矩阵中的分段错误
【发布时间】:2015-03-17 22:37:58
【问题描述】:

我正在试验一些基本的 C 代码,它用指针定义了一个 int 矩阵。

typedef int **Matrix;

Matrix createMatrix(int lines, int columns) {
    int i, j;
    Matrix m = (Matrix) malloc(sizeof(int) * lines * columns);
    for (i = 0; i < lines; ++i) {
        for (j = 0; j < columns; ++j) {
            m[i][j] = 0;
        }
    }
    return m;
}

int main(int argc, char**argv) {
    Matrix m = createMatrix(5, 10);
    // ...
    if (m[2][3] == 20) {
        // ...
    }
    return 0;
}

但是,这些m[i][j] 访问会引发分段错误。这里有什么问题?星号太多?

我确信指向 int 指针的指针实际上与矩阵相同。

【问题讨论】:

  • 您是否加入了stdlib.h
  • 在这个网站上查看一些关于“如何分配二维数组”的其他问题,有很多工作示例
  • 你知道数组和指针的区别吗?指向指针的指针、指针数组和数组数组是完全不同的东西(尽管第二个可以与第一个指向)。

标签: c pointers matrix segmentation-fault


【解决方案1】:

Matrix 数据项的分配假设您使用单个索引线性访问它。如果你想用两个索引来访问它,例如m[1][1]你需要分配每个维度:

Matrix m = malloc(sizeof(int *) * lines);

for ( int i = 0; i < lines; i++ )
    m[i] = malloc(sizeof(int) * columns);

还要注意你should not type cast malloc

【讨论】:

  • 愚蠢的错误。单独分配每个数组是有意义的。
  • @afsantos 当有人第一次学习分配多维数组时,这实际上很常见。看起来它是m[i][j] 的方法是从m 地址索引i,并从m[i] 地址索引j
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多