Asignando valores a un arreglo 3d en C

Tengo 2 matrices de la siguiente manera:

int **data; int ***count; 

Después de ejecutar un análisis, quiero hacer la siguiente asignación:

 count[i][j][k] = data[i][j]; 

Sin embargo, sigo recibiendo un error de Segmentación que creo que está relacionado con algunos problemas de asignación de punteros. ¿Alguien puede sugerir cómo puedo realizar esta asignación?

Valores típicos de – datos [i] [j] = 0/1/2.

Definición de ZALLOC:

 #define ZALLOC(item,n,type) if ((item = (type *)calloc((n),sizeof(type))) == NULL) fatalx("Unable to allocate %d unit(s) for item\n",n) // memory assignment int **data; int nrow, ncol; ZALLOC(data, ncol, int *); for (index = 0; index < ncol; index++) { ZALLOC(data[index], nrow, int); } int g=0, index1=0, index2=2; data[index1][index2] = g; int ***count; int dim1 = 100, dim2 = 1, dim3=2; ZALLOC(count, dim1, int **); for (i = 0; i < dim1; i++) { ZALLOC(count[i], dim2, int *); for (j = 0; j < dim2; j++) { ZALLOC(count[i][j], dim3, int); } } // Initialize for (i = 0; i < dim1; i++) { for (j = 0; j < dim2; j++) { for (k = 0; k < dim3; k++) { count[i][j][k] = 0; } } } // Assignment count[0][1][2] = data[1][2]; 

Su organización de las asignaciones es un poco extraño. Si tiene 3 dimensiones (llamémoslas niveles, filas y columnas), normalmente asignaría espacio para mantener los niveles, y luego, para cada nivel, asignaría el espacio para las filas dentro del nivel, y finalmente, asignaría El espacio para las columnas dentro de la fila.

Tu código parece comenzar en el medio (filas); entonces hace algo de trabajo a niveles; y finalmente en las columnas.

Este código es una completa reescritura tuya, pero funciona sin fallar. Todavía no lo he validado con valgrind ; Necesito actualizar la versión en esta máquina.

 #include  #include  #define ZALLOC(item, n, type) if ((item = (type *)calloc((n), sizeof(type))) == NULL) \ fatalx("Unable to allocate %d unit(s) for item\n", n) static void fatalx(const char *str, size_t n) { fprintf(stderr, "%s: %zu\n", str, n); exit(1); } static int ***alloc_3d(int levels, int rows, int cols) { int count = 0; int ***array_3d; ZALLOC(array_3d, levels, int **); for (int i = 0; i < levels; i++) { int **data; ZALLOC(data, rows, int *); array_3d[i] = data; for (int j = 0; j < rows; j++) { int *entries; ZALLOC(entries, cols, int); array_3d[i][j] = entries; for (int k = 0; k < cols; k++) { array_3d[i][j][k] = count++; } } } return array_3d; } static void print_3d(int ***a3d, int levels, int rows, int cols) { for (int i = 0; i < levels; i++) { printf("%d:\n", i); for (int j = 0; j < rows; j++) { printf(" %d: ", j); for (int k = 0; k < cols; k++) printf(" %3d", a3d[i][j][k]); putchar('\n'); } } } static void free_3d(int ***a3d, int levels, int rows) { for (int i = 0; i < levels; i++) { for (int j = 0; j < rows; j++) free(a3d[i][j]); free(a3d[i]); } free(a3d); } int main(void) { int d1 = 3; int d2 = 5; int d3 = 7; int ***a3d = alloc_3d(d1, d2, d3); print_3d(a3d, d1, d2, d3); free_3d(a3d, d1, d2); return(0); } 

Salida:

 0: 0: 0 1 2 3 4 5 6 1: 7 8 9 10 11 12 13 2: 14 15 16 17 18 19 20 3: 21 22 23 24 25 26 27 4: 28 29 30 31 32 33 34 1: 0: 35 36 37 38 39 40 41 1: 42 43 44 45 46 47 48 2: 49 50 51 52 53 54 55 3: 56 57 58 59 60 61 62 4: 63 64 65 66 67 68 69 2: 0: 70 71 72 73 74 75 76 1: 77 78 79 80 81 82 83 2: 84 85 86 87 88 89 90 3: 91 92 93 94 95 96 97 4: 98 99 100 101 102 103 104