You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:46:07