gpt4 book ai didi

c - int** 矩阵分割错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:54 25 4
gpt4 key购买 nike

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

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 上。我不明白,我做错了什么?

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

亲切的问候,劳尔。

最佳答案

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

关于c - int** 矩阵分割错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com