passare un puntatore triplo in funzione, quindi eseguire il mallocing di un array 2D

Ottenere un errore di segmentazione e non capisco il motivo, devi passare in triplo puntatore per l’assegnazione, quindi non puoi cambiarlo …

Ecco la funzione

void alloc2d(double*** a, int m, int n) { int i, j; **a = malloc(sizeof(double *) * m); a[0] = malloc(sizeof(double) * n * m); for(i = 0; i < m; i++) a[i] = (*a + n * i); } 

Ecco la chiamata della funzione …

 double** m; alloc2d(&m, 5, 10); double count = 0.0; for (int i = 0; i < 5; i++) for (int j = 0; j < 10; j++) m[i][j] = ++count; for (int i = 0; i < 5; i++) for (int j = 0; j < 10; j++) printf("%f ", m[i][j]); 

Si desidera allocare la memoria per il puntatore a cui si riferisce. Cambia **a = malloc(sizeof(double *) * m); a *a = malloc(sizeof(double *) * m); . Alraedy hai allocato la memoria per a[0] , quindi avvia il tuo loop con l’indice 1 . Il tipo di a[0] che è simile a *a è double** , ma si desidera impostare il puntatore a cui si riferisce a[0] . Cambia a[0] in (*a)[0] e a[i] in (*a)[i] . Adatta il tuo codice in questo modo:

 void alloc2d(double*** a, int m, int n) { *a = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double* (*a)[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double for( int i=1; i 

Penso che questo sarebbe più comprensibile:

 void alloc2d(double*** a, int m, int n) { double **temp = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double* temp[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double for ( int i=1; i