函数 malloc 不知道您要分配什么样的数组。它只是分配用户指定大小的内存范围。
您需要正确声明指向已分配内存的指针,您可以使用类似的表达式
a[i][j][k]
访问已分配数组的元素,其中 i、j 和 k 是一些索引。
您可以分配一个三维数组,例如以下方式
enum { N1 = 2, N2 = 3, N3 = 4 };
int ( *a )[N2][N3] = malloc( sizeof( int[N1][N2][N3] ) );
或
int ( *a )[N2][N3] = malloc( N1 * sizeof( int[N2][N3] ) );
或
int ( *a )[N2][N3] = malloc( N1 * sizeof( *a ) );
或喜欢
int ( *a )[N2][N3] = malloc( N1 * N2 * sizeof( int[N3] ) );
或
int ( *a )[N2][N3] = malloc( N1 * N2 * sizeof( **a ) );
甚至喜欢
int ( *a )[N2][N3] = malloc( N1 * N2 * N3 * sizeof( int ) );
或
int ( *a )[N2][N3] = malloc( N1 * N2 * N3 * sizeof( ***a ) );
如果您的编译器支持可变长度数组,则 N1、N2 和 N3 不必是整数常量表达式。
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
enum { N1 = 2, N2 = 3, N3 = 4 };
int ( *a )[N2][N3];
a = malloc( sizeof( int[N1][N2][N3] ) );
free( a );
a = malloc( N1 * sizeof( int[N2][N3] ) );
free( a );
a = malloc( N1 * sizeof( *a ) );
free( a );
a = malloc( N1 * N2 * sizeof( int[N3] ) );
free( a );
a = malloc( N1 * N2 * sizeof( **a ) );
free( a );
a = malloc( N1 * N2 * N3 * sizeof( int ) );
free( a );
a = malloc( N1 * N2 * N3 * sizeof( ***a ) );
free( a );
return 0;
}
如果您的编译器不支持可变长度数组并且您需要在运行时确定三维数组的大小,那么您可以分配一个一维数组并使用索引表达式模拟一个三维数组,或者您将需要分配数组的数组。
例如
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
enum { N1 = 2, N2 = 3, N3 = 4 };
int ***a = malloc( N1 * sizeof( int ** ) );
for ( size_t i = 0; i < N1; i++ )
{
a[i] = malloc( N2 * sizeof( int * ) );
for ( size_t j = 0; j < N2; j++ )
{
a[i][j] = malloc( N3 * sizeof( int ) );
}
}
//...
for ( size_t i = 0; i < N1; i++ )
{
for ( size_t j = 0; j < N2; j++ )
{
free( a[i][j] );
}
free( a[i] );
}
free( a );
return 0;
}