【问题标题】:int** matrix segmentation faultint** 矩阵分段错误
【发布时间】:2015-10-22 05:34:15
【问题描述】:

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

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
    }
  }
}

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

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

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

但同样的错误会弹出。从不在索引 0 上,总是在索引 1 上。我不明白,我做错了什么?

任何形式的帮助将不胜感激!

亲切的问候, 劳尔。

【问题讨论】:

  • 我建议不要将变量矩阵传递给您的初始化函数以使初始化返回矩阵,而是更容易阅读。例如int** matrix = initialize(8);int** initialize(int size); 因为无论如何你都没有在你的 initialize() 函数中执行 realloc .. 也可能 allocateAndInitializeMatrix 更适合作为描述函数作用的函数名。只是我的 2c。
  • 与您的问题无关,因为下面有一个很好的答案,但值得一提的是,您不应该转换 malloc 或 calloc 的结果!在这里阅读stackoverflow.com/questions/605845/…
  • 是的,这是个好主意,谢谢 :)
  • @geeksoul 我这样做是因为我在 C 中编译。
  • @MasterKoder 我的链接仅适用于 C!在 C 中,您不需要强制转换 malloc 或 calloc 的返回值。 malloc/calloc 返回的指向 void 的指针会自动转换为正确的类型。但是,如果您希望您的代码使用 C++ 编译器进行编译,则需要进行强制转换。

标签: c memory matrix crash segmentation-fault


【解决方案1】:
*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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多