Short : Как передать двумерный массив в качестве аргумента функции и получить результаты, сохраненные в адресе аргумента?
Longer : у меня есть код ( ниже) которая вызывает main()
функцию инициализации, а затем печатает содержимое. Однако я ожидаю, что после сохранения указателей, заданных malloc
, в переменную A
результаты будут сохранены в аргументе, но это не так. При выполнении аналогичных действий с 1D-массивами это работает плавно, но не для 2D-массивов.
Для простоты в этом случае я делаю это 3x3, но я хочу иметь нефиксированный объем ГБ данных. Затем я должен использовать 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]
не указывает на root матрицы. Я использую G CC и стандартный 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-массивов, но они не решают мою проблему, поскольку не решают проблему получения результатов в аргумент.
Edit : это простой случай, но мне нужно было бы передать несколько матриц в качестве аргументов функции. Поэтому я не могу просто вернуть адрес матрицы A
, потому что мне нужно было бы сохранить адреса нескольких матриц.