c - C:将二维数组作为函数参数传递,并获取存储在参数地址中的结果
问题描述
简短:如何将二维数组作为函数参数传递并获取存储在参数地址中的结果?
更长:我有代码(如下),它从main()
初始化函数调用,然后打印内容。但是,我希望在将 by 给出的指针存储malloc
到变量A
中之后,结果将保存在参数中,但事实并非如此。当用一维数组做类似的事情时,它工作顺利,但不适用于二维数组。
为简单起见,在这种情况下,我将其设为 3x3,但我希望拥有非固定数量的 GB 数据。然后,我必须使用malloc
并且不能在编译时声明矩阵大小。
#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");
}
}
void init(int n, double **A) {
int i;
A = (double **)malloc(n * n * sizeof(double *));
for(i=0; i<n; i++) {
A[i] = (double *)malloc(n * sizeof(double));
}
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;
init(n, A);
print_matrix(n, A);
for(i=0; i<n; i++)
free(A[i]);
free(A);
return 0;
}
编译后,我可以在init()
函数内部打印矩阵的内容,但不能在main()
没有分段错误的情况下打印,这当然意味着 A 指向未分配的内存,甚至A[0][0]
没有指向矩阵的根。我正在使用 GCC 和标准 C99。
$ gcc --version
gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008
$ gcc main.c -o main -std=c99
$ ./main
9.00 6.00 -3.00
6.00 13.00 -5.00
-3.00 -5.00 18.00
Segmentation fault (core dumped)
关于传递 2D 数组还有其他有用的问题,但它们并没有解决我的观点,因为它们没有解决在参数中返回结果的问题。
编辑:这是一个简单的案例,但我需要将几个矩阵作为函数参数传递。因此,我不能简单地返回矩阵的地址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 ** init(int n) {
int i;
double **A;
A = (double **)malloc(n * n * sizeof(double *));
for(i=0; i<n; i++) {
A[i] = (double *)malloc(n * sizeof(double));
}
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);
return A;
}
int main() {
int i;
int n=3;
double **A;
A = init(n);
print_matrix(n, A);
for(i=0; i<n; i++)
free(A[i]);
free(A);
return 0;
}
在 init() 函数中分配内存并返回指针。
[ronald@ocelot tmp]$ ./x
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
原始问题的答案是(仅更改后的代码)
void init(int n, double ***A) {
int i;
*A = (double **)malloc(n * n * sizeof(double *));
for(i=0; i<n; i++) {
(*A)[i] = (double *)malloc(n * sizeof(double));
}
(*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;
init(n, &A);
print_matrix(n, A);
for(i=0; i<n; i++)
free(A[i]);
free(A);
return 0;
}
推荐阅读
- java - Spring boot JPA相关实体说明
- r - 在R中的for循环中为每个索引组合函数的输出
- github-actions - Github Action 是否支持按需自托管运行器?
- python - 如何强制第二级多索引的值?
- c# - Unity - 暂停/恢复按钮会触发我的跳跃动画 - 如何解决?
- jdbc - JBoss 池的 IdleCount 值为负
- python - 重新拟合已保存的 scikit-learn 模型,但未使用某些功能 - “ValueError: A given column is not a column of the dataframe”
- javascript - 如何在 React 中动态传递组件?
- reactjs - SyncState 与将整个状态发送给其他客户端有何不同?
- javascript - 将带有两个文件和文本的 FormData 发送到控制器