일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- git
- 깃
- vim
- 도커
- 포인터
- 플러터
- Algorithm
- jupyter
- C# delegate
- docker
- Data Structure
- C언어 포인터
- c언어
- dart 언어
- HTML
- C++
- Flutter
- c#
- 구조체
- Python
- Unity
- 다트 언어
- c# 추상 클래스
- 유니티
- c# 윈폼
- Houdini
- c# winform
- github
- gitlab
- jupyter lab
Archives
- Today
- Total
nomad-programmer
[C] 3차원 배열 같은 3차원 포인터의 동적 할당 본문
https://nomad-programmer.tistory.com/87
위의 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바이트
'Programming > C' 카테고리의 다른 글
[Programming/C] 구조체 멤버 정렬 (Struct Member Alignment) (0) | 2020.06.14 |
---|---|
[C] typedef (0) | 2020.06.14 |
[C] 2차원 배열 같은 2차원 포인터의 동적 할당 (0) | 2020.06.13 |
[C] 동적 할당으로 간단히 구현해본 stack (0) | 2020.06.13 |
[C] 동적 할당 (malloc, free) (0) | 2020.06.11 |
Comments