可能重复:
Malloc a 3-Dimensional array in C?
dynamic allocation/deallocation of 2D & 3D arrays
如何使用malloc分配3D数组?
答案 0 :(得分:16)
分配3D阵列有两种不同的方法。您可以将其分配为指向(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));
}
}
有时将数组分配为连续的块更合适。您会发现许多现有库可能要求阵列存在于已分配的内存中。这样做的缺点是,如果你的数组非常大,你可能在内存中没有这么大的连续块。
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));
要访问您的阵列,您只需使用宏:
ARR(1,0,3) = 4;
答案 1 :(得分:6)
这样可行
int main()
{
int ***p,i,j;
p=(int ***) malloc(MAXX * sizeof(int **));
for(i=0;i<MAXX;i++)
{
p[i]=(int **)malloc(MAXY * sizeof(int *));
for(j=0;j<MAXY;j++)
p[i][j]=(int *)malloc(MAXZ * sizeof(int));
}
for(k=0;k<MAXZ;k++)
for(i=0;i<MAXX;i++)
for(j=0;j<MAXY;j++)
p[i][j][k]=<something>;
}
答案 2 :(得分:1)
array = malloc(num_elem * num_elem * num_elem * sizeof(array_elem));
为什么不呢? :)
答案 3 :(得分:1)
@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<icount;i++)
iret[i] = &jret[i*jcount];
for(int i=0;i<icount;i++)
for(int j=0;j<jcount;i++)
jret[i*jcount+j] = &kret[i*jcount*kcount*type_size+j*kcount*type_size];
return iret;
}
答案 4 :(得分:0)
对于给定类型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
,并且您将获得“不兼容的分配类型”型警告。如果转换结果,则会禁止警告,并且无法保证从指针int
到指针的转换再次有意义。