int **矩阵分段故障

时间:2015-10-22 05:34:15

标签: c memory matrix crash segmentation-fault

我试图通过引用传递矩阵,然后动态初始化它。这只是一个例子:

90.720...

我也尝试过替代方案,将矩阵保存在连续的内存空间中:

int main(int argc, char* argv[]) {
  int** matrix = NULL;

  initialize(&matrix, 8);

  return 0;
}

void initialize(int*** matrix, int size) {
  *matrix = (int**) calloc(size, sizeof(int*));

  for (int i = 0; i < size; ++i) {
    *matrix[i] = (int*) calloc(size, sizeof(int));  // cashes here with segmentation fault
  }

  for (int i = 0; i < size; ++i) {
    for (int j = 0; j < size; ++j) {
      *matrix[i][j] = 5; // some number, doesn't matter for now
    }
  }
}

然而同样的错误突然出现。从不在索引0上,总是在索引1上。我不明白,我做错了什么?

非常感谢任何形式的帮助!

亲切的问候, 劳尔。

1 个答案:

答案 0 :(得分:4)

*matrix[i] = (int*) calloc(size, sizeof(int));

被解释为:

*(matrix[i]) = (int*) calloc(size, sizeof(int));

这就是你看到分段错误的原因。

使用:

(*matrix)[i] = (int*) calloc(size, sizeof(int));

你在行中有类似的错误:

  *matrix[i][j] = 5;

应该是:

  (*matrix)[i][j] = 5;

您可以通过在函数中使用临时变量来避免一些混淆。

void initialize(int*** matrix, int size) {

   int** m = calloc(size, sizeof(int*));

   for (int i = 0; i < size; ++i) {
      m[i] = calloc(size, sizeof(int));
   }

   for (int i = 0; i < size; ++i) {
      for (int j = 0; j < size; ++j) {
         m[i][j] = 5; // some number, doesn't matter for now
      }
   }

   *matrix = m;
}