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
相关产品推荐
相关产品推荐

