在C中为3d数组赋值

我有2个数组如下 –

int **data; int ***count; 

运行一些分析后,我想做以下任务 –

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

但是,我一直在收到Segmentation故障,我认为这与一些指针分配问题有关 – 有人可以建议我如何进行这项任务吗?

典型值 – data [i] [j] = 0/1/2。

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]; 

您的分配组织有点奇怪。 如果你有3个维度(让我们调用它们的级别,行和列),你通常会分配空间来保存级别,然后为每个级别你将为级别中的行分配空间,然后最后你将分配行内列的空间。

你的代码似乎从中间(行)开始; 然后做一些水平的工作; 最后是在专栏。

此代码完全重写您的代码,但它可以正常运行而不会崩溃。 我还没valgrindvalidation它; 我需要在这台机器上升级版本。

 #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); } 

输出:

 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