C – allocazione di una matrice in una funzione

Sto cercando di allocare una matrice usando una funzione che prende le sue dimensioni e un puntatore triplo. Ho assegnato un int ** (impostato su NULL) e sto passando il suo indirizzo come argomento della funzione. Questo mi dà una violazione di accesso di mem per qualche motivo.

void allocateMatrix(int ***matrix, int row, int col) { int i; if((*matrix = (int**)malloc(row * sizeof(int*))) == NULL) { perror("There has been an error"); exit(EXIT_FAILURE); } for(i = 0; i < row; ++i) { if((*matrix[i] = (int*)malloc(col * sizeof(int))) == NULL) { perror("There has been an error"); exit(EXIT_FAILURE); } } } /* main.c */ int** matrix = NULL; allocateMatrix(&matrix, MATRIX_ROW, MATRIX_COL); //error 

Devi cambiare

 if((*matrix[i] = (int*)malloc(col * sizeof(int))) == NULL) 

a

 if(((*matrix)[i] = (int*)malloc(col * sizeof(int))) == NULL) // ^ ^ 

È necessario dereferenziare la matrix prima di utilizzare l’indice dell’array.
*matrix[i] è equivalente a *(matrix[i])

È un problema di precedenza degli operatori. In

 if ((*matrix[i] = (int*)malloc( ... )) 

la precedenza predefinita è *(matrix[i]) , mentre dovresti usare (*matrix)[i] .

Consiglierei comunque di allocare la matrice come array contiguo invece come una matrice di puntatori agli array.

Ho creato un programma di soluzione per gcc C11 / C99 con funzioni di allocazione appropriate basate sui collegamenti:

http://c-faq.com/aryptr/dynmuldimary.html

http://c-faq.com/aryptr/ary2dfunc3.html

Dopo una discussione nei commenti, è chiaro che matrix2 è correttamente allocata, può essere passato a questa funzione fn (int row, int col, int array [col] [row]) come matrix2 [0] (dati in un array dimensionale ) con un cast a (double (*) [])

 //compile with gcc --std=c11 program.c #include  #include  #define MX 9 #define MY 14 void input_matrix(int row, int column, double matrix[row][column]); void print_matrix(int row, int column, double matrix[row][column]); double **alloc_matrix2(int row, int column); double *alloc_matrix3(int row, int column); void *alloc_matrix4(int row, int column); int main() { int i=MX, j=MY; printf("Generate input values and print matrices with functions fn(int w, int k, double matrix[w][k]) (in C99 and C11)\n"); double matrix1[i][j]; input_matrix(MX,MY,matrix1); printf("matrix static\n"); print_matrix(MX,MY,matrix1); double **matrix2; //data of matrix2 is just matrix3 matrix2=alloc_matrix2(MX,MY); input_matrix(MX,MY,(double (*)[])(*matrix2)); printf("matrix two times allocated one for pointers, the second for data (double (*)[])(m[0])\n"); print_matrix(MX,MY,(double (*)[])(matrix2[0])); free(*matrix2); free(matrix2); double *matrix3=alloc_matrix3(MX,MY); input_matrix(MX,MY,(double (*)[])matrix3); printf("matrix allocated as two-dimensional array\n"); print_matrix(MX,MY,(double (*)[])matrix3); free(matrix3); j=MY; double (*matrix4)[j]; matrix4 = (double (*)[])alloc_matrix4(MX,MY); input_matrix(MX,MY,matrix4); printf("matrix allocated via pointer to array m = (double (*)[])malloc(MX * sizeof(*m))\n"); print_matrix(MX,MY,matrix4); free(matrix4); printf("\nThe End!\n"); return 0; } void input_matrix(int row, int column, double matrix[row][column]){ for(int i=0; i