C – asignar una matriz en una función

Intento asignar una matriz usando una función que toma sus dimensiones y un puntero triple. He asignado un int ** (establecido en NULL) y estoy pasando su dirección como argumento de la función. Eso me da una infracción de acceso a la memoria por alguna razón.

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 

Necesitas cambiar

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

a

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

Necesita eliminar la matrix antes de usar el subíndice de matriz.
*matrix[i] es equivalente a *(matrix[i])

Es un problema de precedencia del operador. En

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

la precedencia predeterminada es *(matrix[i]) , mientras que debe usar (*matrix)[i] .

Todavía recomendaría asignar la matriz como una matriz contigua en su lugar como una matriz de punteros a las matrices.

He hecho un progtwig de solución para gcc C11 / C99 con funciones de asignación adecuadas basadas en enlaces:

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

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

Después de una discusión en los comentarios, está claro que la matriz2 está correctamente asignada, se puede pasar a esta función fn (int fila, int col, int matriz [col] [fila]) como matrix2 [0] (datos en una matriz dimensional ) con un molde a (doble (*) [])

 //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