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 的内存
|