3维数组举例
int*** malloc_arr(int x, int y, int z, int default_value = 0)
{
// 分配空间
int*** arr = new int** [x];
arr[0] = new int* [x * y]();
arr[0][0] = new int[x * y * z]();
// 初始化第二维
for (int i = 1; i < x; i++)
arr[i] = arr[i - 1] + y;
// 初始化第三维
int** p = arr[0];
for (int i = 1; i < x * y; i++)
p[i] = p[i - 1] + z;
// 设置初始置
if (default_value != 0)
{
int* pp = &arr[0][0][0];
for (int i = 0; i < x * y * z; i++)
*pp++ = default_value;
}
return arr;
}
void free_arr(int*** & arr)
{
if (arr)
{
delete arr[0][0];
delete arr[0];
delete arr;
}
arr = nullptr;
}
void test_use()
{
int*** arr = malloc_arr(2, 3, 4, 666);
printf("%d\n", arr[0][0][0]);
printf("%d\n", arr[1][0][0]);
printf("%d\n", arr[0][1][0]);
printf("%d\n", arr[0][0][1]);
printf("%d\n", arr[1][2][3]);
free_arr(arr);
}
比起多个for的嵌套new来分配,这种分配方式显然更合理,连续内存块对指针也更友好
对于分配 x ∗ y ∗ z x * y * z x∗y∗z 的空间,总共需要 x 3 + y 2 + z x^3 + y^2 + z x3+y2+z 的内存