3D数组的动态内存分配

可能重复:
Malloc是C中的三维数组?
2D和3Darrays的动态分配/释放

如何使用malloc分配3D数组?

array = malloc(num_elem * num_elem * num_elem * sizeof(array_elem)); 

为什么不? 🙂

分配3Darrays有两种不同的方法。 您可以将其分配为指向(1D数组指针的1D数组)指针的一维数组。 这可以按如下方式完成:

  int dim1, dim2, dim3; int i,j,k; double *** array = (double ***)malloc(dim1*sizeof(double**)); for (i = 0; i< dim1; i++) { array[i] = (double **) malloc(dim2*sizeof(double *)); for (j = 0; j < dim2; j++) { array[i][j] = (double *)malloc(dim3*sizeof(double)); } } 

有时将数组分配为连续的块更合适。 您会发现许多现有库可能要求arrays存在于已分配的内存中。 这样做的缺点是,如果你的数组非常大,你可能在内存中没有这么大的连续块。

 const int dim1, dim2, dim3; /* Global variables, dimension*/ #define ARR(i,j,k) (array[dim2*dim3*i + dim3*j + k]) double * array = (double *)malloc(dim1*dim2*dim3*sizeof(double)); 

要访问您的arrays,您只需使用宏:

 ARR(1,0,3) = 4; 

这会奏效

 int main() { int ***p,i,j; p=(int ***) malloc(MAXX * sizeof(int **)); for(i=0;i; } 

@Poita_,好吧,也许你是对的,但是如果有人还想在一个大块中使用三维数组,那么你可以在这里添加正常的索引:

 void*** newarray(int icount, int jcount, int kcount, int type_size) { void*** iret = (void***)malloc(icount*sizeof(void***)+icount*jcount*sizeof(void**)+icount*jcount*kcount*type_size); void** jret = (void**)(iret+icount); char* kret = (char*)(jret+icount*jcount); for(int i=0;i 

对于给定类型T(非连续):

 size_t dim0, dim1, dim2; ... T ***arr = malloc(sizeof *arr * dim0); //type of *arr is T ** if (arr) { size_t i; for (i = 0; i < dim0; i++) { arr[i] = malloc(sizeof *arr[i] * dim1); // type of *arr[i] is T * if (arr[i]) { size_t j; for (j = 0; j < dim1; j++) { arr[i][j] = malloc(sizeof *arr[i][j] * dim2); } } } } 

除非您正在使用非常旧的(C89之前的)实现,否则您不需要转换malloc()的结果,并且不鼓励这种做法。 如果您忘记包含stdlib.h或者在范围内没有malloc()的原型,编译器将键入它以返回int ,并且您将获得“不兼容的分配类型”类型警告。 如果转换结果,则会禁止警告,并且无法保证从指针到指针的指针再次转换为指针会有意义。