【发布时间】: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