为何多维数组指针传递给函数后访问会触发段错误?
为什么传递指向多维数组的指针给函数后访问会出现段错误?
嘿,这个问题我太熟悉了——核心问题出在C语言的参数传递机制上,你在函数里对指针的修改根本没传到主函数里,导致主函数里的指针还是无效状态,访问自然就崩了。
咱们来拆解下你的代码问题:
你的gen_matrix函数参数是int **array,当你从主函数调用它时,C会把主函数里的指针变量复制一份传给这个参数。你在函数里执行array = (int **) malloc(...),其实只是修改了函数内部的那个副本指针,主函数里原来的指针完全没变化——它还是初始的NULL或者随机垃圾值,当你在主函数里尝试访问这个指针指向的内容时,必然触发段错误。
给你两种靠谱的解决方案:
方案1:让函数返回分配好的指针
这是最直观的写法,直接把分配好的二级指针返回给主函数:
#include <stdio.h> #include <stdlib.h> int **gen_matrix(int rm, int cm) { int **array = (int **) malloc(sizeof(int *) * rm); for (int r = 0; r < rm; ++r) { array[r] = (int *) malloc(sizeof(int) * cm); for (int c = 0; c < cm; ++c) { array[r][c] = 1; } } return array; } int main() { int rows = 3, cols = 3; int **matrix = gen_matrix(rows, cols); // 测试访问矩阵 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } // 重要:用完记得释放内存,避免泄漏 for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; }
方案2:传递指针的指针(修改主函数的指针变量)
如果你坚持要用void类型的函数,那就要传递int ***array——也就是二级指针的指针,这样才能在函数里修改主函数里的二级指针变量:
#include <stdio.h> #include <stdlib.h> void gen_matrix(int ***array, int rm, int cm) { // 这里修改的是主函数里指针的内容 *array = (int **) malloc(sizeof(int *) * rm); for (int r = 0; r < rm; ++r) { // 注意括号,优先级很重要 (*array)[r] = (int *) malloc(sizeof(int) * cm); for (int c = 0; c < cm; ++c) { (*array)[r][c] = 1; } } } int main() { int rows = 3, cols = 3; int **matrix = NULL; // 传递指针的地址 gen_matrix(&matrix, rows, cols); // 测试访问 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } // 释放内存 for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; }
额外提醒
- 不管用哪种方案,一定要记得释放内存,不然会造成内存泄漏
- 如果你的场景允许,还可以分配连续内存的二维数组(比如用
int (*array)[cm]),这样内存更紧凑,释放的时候只需要free一次就行,不过这种写法需要C99及以上标准支持。
内容的提问来源于stack exchange,提问作者Lycaon
相关产品推荐
相关产品推荐

