我有一个使用指针管理的3D数组的巨大代码.就像是:
int *** tab; tab = malloc(m*sizeof(int**)); for(i= 1..n) tab[i] = malloc(n*sizeof(int*)); ... etc...
后来元素被访问:
tab[i][j][k] = ...
但是由于这个结构的特定问题,我想声明tab作为连续的数组,但在代码中仍然使用带有3个方括号的语法.编译器将内部替换它们,如下所示:
tab[i][j][k] = ... => tab[i*m*n+j*m+k] = ...
因此,仅使用一个指针取消引用来访问数组.我不想更改源代码(没有sed).
例如我可以通过在堆栈中声明tab来实现:
int tab[n][m][l];
但是不幸的是,如果m和n是运行时变量,这不起作用.
解决方法
在C(C99或C11)中,具有可变维度的制表符阵列可以作为函数参数传递,只要其尺寸也在前面的参数中传递即可.这是一个示例来显示我的意思:
#include <stdio.h> #include <stdlib.h> int sum3d(unsigned int dim_n,unsigned int dim_m,unsigned int dim_l,int tab[dim_n][dim_m][dim_l]) { int total = 0; int n,m,l; for (n = 0; n < dim_n; n++) { for (m = 0; m < dim_m; m++) { for (l = 0; l < dim_l; l++) { total += tab[n][m][l]; } } } return total; } int main(void) { unsigned int dim_n,dim_m,dim_l; unsigned int n,l; int tot; dim_n = 10; dim_m = 5; dim_l = 4; int (*tab)[dim_m][dim_l] = calloc(dim_n,sizeof(*tab)); if (!tab) { fprintf(stderr,"Memory allocation failure!\n"); exit(1); } for (n = 0; n < dim_n; n++) { for (m = 0; m < dim_m; m++) { for (l = 0; l < dim_l; l++) { tab[n][m][l] = 1; } } } printf("total = %d\n",sum3d(dim_n,dim_l,tab)); return 0; }
在函数sum3d中,tab可以被声明为int tab [] [dim_m] [dim_l],或者作为int(* tab)[dim_m] [dim_l],在这两种情况下都省略了最左边的维.