Programming/C
[C] 3차원 배열 같은 3차원 포인터의 동적 할당
scii
2020. 6. 13. 23:33
https://nomad-programmer.tistory.com/87
[C] 2차원 배열 같은 2차원 포인터의 동적 할당
열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메�
nomad-programmer.tistory.com
위의 2차원 포인터 동적 할당 포스터중의 예제에서 확장한 것이다.
#include <stdio.h>
#include <malloc.h>
int main(void) {
unsigned int*** arr3d;
unsigned int cnt3d;
unsigned int cnt2d;
unsigned int cnt1d;
unsigned int temp;
fputs("x축 개수: ", stdout);
scanf_s("%d", &temp);
arr3d = (int***)malloc(temp * sizeof(int**));
cnt3d = (_msize(arr3d) / sizeof(int**));
for (int x = 0; x < cnt3d; x++) {
printf("\n-- %d번째 x축 --\n", x + 1);
fputs("y축 개수: ", stdout);
scanf_s("%d", &temp);
*(arr3d + x) = (int**)malloc(temp * sizeof(int*));
cnt2d = (_msize(*(arr3d + x)) / sizeof(int*));
for (int y = 0; y < cnt2d; y++) {
printf("\n-- %d번째 y축 --\n", y + 1);
fputs("z축 개수: ", stdout);
scanf_s("%d", &temp);
*(*(arr3d + x) + y) = (int*)malloc(temp * sizeof(int));
cnt1d = (_msize(*(*(arr3d + x) + y)) / sizeof(int));
for (int z = 0; z < cnt1d; z++) {
*(*(*(arr3d + x) + y) + z) = z;
}
}
}
puts("");
for (int x = 0; x < cnt3d; x++) {
cnt2d = _msize(*(arr3d + x)) / sizeof(int*);
for (int y = 0; y < cnt2d; y++) {
cnt1d = _msize(*(*(arr3d + x) + y)) / sizeof(int);
for (int z = 0; z < cnt1d; z++) {
printf("%d ", *(*(*(arr3d + x) + y) + z));
}
free(*(*(arr3d + x) + y));
puts("");
}
free(*(arr3d + x));
puts("");
}
free(arr3d);
return 0;
}
// 결과
/*
x축 개수: 3
-- 1번째 x축 --
y축 개수: 4
-- 1번째 y축 --
z축 개수: 8
-- 2번째 y축 --
z축 개수: 2
-- 3번째 y축 --
z축 개수: 3
-- 4번째 y축 --
z축 개수: 5
-- 2번째 x축 --
y축 개수: 3
-- 1번째 y축 --
z축 개수: 7
-- 2번째 y축 --
z축 개수: 2
-- 3번째 y축 --
z축 개수: 3
-- 3번째 x축 --
y축 개수: 5
-- 1번째 y축 --
z축 개수: 6
-- 2번째 y축 --
z축 개수: 2
-- 3번째 y축 --
z축 개수: 7
-- 4번째 y축 --
z축 개수: 3
-- 5번째 y축 --
z축 개수: 5
0 1 2 3 4 5 6 7
0 1
0 1 2
0 1 2 3 4
0 1 2 3 4 5 6
0 1
0 1 2
0 1 2 3 4 5
0 1
0 1 2 3 4 5 6
0 1 2
0 1 2 3 4
*/
이것 또한 마찬가지로 스택영역에서 3차원 배열을 선언했다면...
(3 * 5 * 8 * 4바이트) = 총 480바이트
총 480바이트가 필요했을 것이다.
그러나 힙 영역에서의 동적 할당을 활용하여 메모리를 데이터에 딱 맞게 할당하였다. 이로 인해 메모리를 낭비하는 일을 줄였다.
(18 * 4바이트) + (12 * 4바이트) + (23 * 4바이트) = 총 212바이트