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

C语言中如何传递二维数组作为函数参数并保存结果至参数地址?

问题分析与解决方案

你的问题核心在于C语言的参数传递是值传递——当你把main里的double **A传给init函数时,函数里的A只是原指针的一个副本。你在init里给这个副本分配内存、赋值,完全不会影响main中那个未初始化的原指针,所以回到main后,A还是个野指针,访问它自然会触发段错误。

另外你代码里还有一个容易忽略的错误:malloc(n * n * sizeof(double *))是错的!我们要创建的是一个包含n个double*的指针数组(每个元素指向一行的起始地址),所以只需要分配n * sizeof(double *)的空间,n*n会导致你多分配了很多不必要的内存。

修正方案:传递指针的指针

要让init函数能修改main里的指针,你需要传递指针的指针(也就是double ***A),这样就能通过解引用操作修改原指针的指向。

修改后的完整代码

#include <stdio.h>
#include <stdlib.h>

void print_matrix(int n, double **A) {
    int i, j;
    for(i=0; i<n; i++) {
        for(j=0;j<n;j++) {
            printf("%0.2f ",A[i][j]);
        }
        printf("\n");
    }
}

// 修改参数为double ***A
void init(int n, double ***A) {
    int i;
    // 给原指针指向的位置分配内存(即修改main里的A)
    *A = (double **)malloc(n * sizeof(double *));
    for(i=0; i<n; i++) {
        (*A)[i] = (double *)malloc(n * sizeof(double));
    }
    // 赋值时也要通过*A访问
    (*A)[0][0] = 9.0;
    (*A)[0][1] = 6.0;
    (*A)[0][2] = -3.0;
    (*A)[1][0] = 6.0;
    (*A)[1][1] = 13.0;
    (*A)[1][2] = -5.0;
    (*A)[2][0] = -3.0;
    (*A)[2][1] = -5.0;
    (*A)[2][2] = 18.0;
    print_matrix(n, *A);
}

int main() {
    int i;
    int n=3;
    double **A;
    // 传递A的地址
    init(n, &A);
    print_matrix(n, A);
    // 释放内存正常执行
    for(i=0; i<n; i++) free(A[i]);
    free(A);
    return 0;
}

运行结果

编译运行后,init和main里的print_matrix都会正常输出矩阵,不会再触发段错误:

9.00 6.00 -3.00 
6.00 13.00 -5.00 
-3.00 -5.00 18.00 
9.00 6.00 -3.00 
6.00 13.00 -5.00 
-3.00 -5.00 18.00 

为什么一维数组的操作能正常运行?

你提到一维数组的类似操作没问题,大概率是因为你当时修改的是指针指向的内容,而不是指针本身。比如如果是一维数组的初始化函数,你传递double *A,然后给A[i]赋值,这是修改指针指向的内存,没问题;但如果是要在函数里给A分配内存,同样需要传递double **A,否则也会遇到和现在一样的问题。

其他可选方案(针对多矩阵场景)

如果需要传递多个矩阵,除了用多个指针的指针参数外,还可以把矩阵的信息封装成结构体:

typedef struct {
    int size;
    double **data;
} Matrix;

void init_matrix(Matrix *mat, int n) {
    mat->size = n;
    mat->data = malloc(n * sizeof(double *));
    // ... 后续初始化逻辑
}

这种方式更清晰,尤其当需要传递多个矩阵时,直接传递结构体指针即可。

内容的提问来源于stack exchange,提问作者albertgumi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:52:50