为何无法用void类型函数动态分配C语言二维数组?
为什么C语言中void类型的二维数组分配函数无法正常工作?
核心原因是C语言采用值传递的参数传递机制,你的void版函数修改的只是指针的副本,主函数里的原始指针根本没被更新。
无效代码的问题分析
看你的无效createMatrix函数:
void createMatrix(int **m,int n){ if(m == NULL){ int i = 0; int j = 0; m = (int**) malloc(n*sizeof(int*)); if(m == NULL) exit(-1); for(i=0;i<n;i++){ m[i] = (int*) malloc(n*sizeof(int)); if(m[i] == NULL) exit(-1); printf("%d ", i); } } }
主函数中你声明了int **m = NULL;,调用createMatrix(m,n)时,程序会把m的当前值(也就是NULL)复制一份,传给函数的形参m。这两个m是完全独立的变量:
- 函数内部给形参
m分配内存、赋值,只是修改了这个局部的副本变量; - 主函数里的原始
m依然是NULL,没有任何变化; - 后续你尝试给
m[0][0]赋值,本质是对NULL指针进行解引用操作,这属于未定义行为,直接导致程序崩溃。
有效代码能工作的原因
返回int**的版本:
int **createMatrix(int n){ int **m = NULL; int i = 0; int j = 0; m = (int**) malloc(n*sizeof(int*)); if(m == NULL) exit(-1); for(i=0;i<n;i++){ m[i] = (int*) malloc(n*sizeof(int)); if(m[i] == NULL) exit(-1); printf("%d ", i); } return m; }
这个函数把分配好的二维数组指针直接返回,主函数通过m = createMatrix(n);接收这个指针地址,此时m指向了正确分配的内存区域,自然能正常访问和操作数组。
如何修改void版函数使其正常工作
如果一定要用void类型的函数,需要传递指针的指针(int ***),这样才能在函数内部修改主函数里的指针变量:
void createMatrix(int ***m, int n){ if(*m == NULL){ int i = 0; *m = (int**) malloc(n*sizeof(int*)); if(*m == NULL) exit(-1); for(i=0;i<n;i++){ (*m)[i] = (int*) malloc(n*sizeof(int)); if((*m)[i] == NULL) exit(-1); printf("%d ", i); } } }
主函数调用时,需要传入m的地址:
int main(){ int n = 5; int **m = NULL; createMatrix(&m, n); // 传入指针的地址 // ... 后续操作 freeMatrix(m,n); return 0; }
这里的*m就是主函数里的原始指针变量,函数内部对*m的赋值会直接作用到主函数的m上,让它指向分配好的内存。
内容的提问来源于stack exchange,提问作者ImRobb
相关产品推荐
相关产品推荐

