int** 矩阵分割错误
int** matrix segmentation fault
我正在尝试通过引用传递一个矩阵,然后对其进行动态初始化。这只是一个例子:
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
}
}
}
我也试过另一种方法,将矩阵保存在连续的内存中space:
*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;
}
我正在尝试通过引用传递一个矩阵,然后对其进行动态初始化。这只是一个例子:
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
}
}
}
我也试过另一种方法,将矩阵保存在连续的内存中space:
*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;
}