일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- C언어 포인터
- jupyter
- docker
- vim
- c#
- 포인터
- c언어
- 도커
- Python
- c# 윈폼
- git
- Houdini
- c# 추상 클래스
- C# delegate
- Data Structure
- Algorithm
- 구조체
- HTML
- dart 언어
- Unity
- 유니티
- 깃
- C++
- 다트 언어
- c# winform
- gitlab
- 플러터
- Flutter
- jupyter lab
- github
Archives
- Today
- Total
nomad-programmer
[C] 2차원 배열 같은 2차원 포인터의 동적 할당 본문
열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다.
허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메모리 구조를 생성할 수 있다.
#include <stdio.h>
#include <malloc.h>
int main(void) {
unsigned int** arr2d;
unsigned int cnt2d;
unsigned int cnt1d;
unsigned int temp;
fputs("x축 개수: ", stdout);
scanf_s("%d", &temp);
arr2d = (int**)malloc(temp * sizeof(int*));
//cnt2d = temp; 아래의 연산과 같음. heap영역에 동적 할당하여 _msize함수 사용
cnt2d = (_msize(arr2d) / sizeof(int*));
for (int i = 0; i < cnt2d; i++) {
printf("\n-- %d번째 x축 --\n", i + 1);
fputs("y축 개수: ", stdout);
scanf_s("%d", &temp);
*(arr2d + i) = (int*)malloc(temp * sizeof(int));
cnt1d = (_msize(*(arr2d + i)) / sizeof(int));
for (int j = 0; j < cnt1d; j++) {
*(*(arr2d + i) + j) = j;
}
}
puts("");
for (int i = 0; i < cnt2d; i++) {
cnt1d = (_msize(*(arr2d + i)) / sizeof(int));
for (int j = 0; j < cnt1d; j++) {
printf("%d ", *(*(arr2d + i) + j));
}
free(*(arr2d + i));
puts("");
}
free(arr2d);
return 0;
}
// 결과
/*
x축 개수: 9
-- 1번째 x축 --
y축 개수: 5
-- 2번째 x축 --
y축 개수: 4
-- 3번째 x축 --
y축 개수: 3
-- 4번째 x축 --
y축 개수: 2
-- 5번째 x축 --
y축 개수: 1
-- 6번째 x축 --
y축 개수: 2
-- 7번째 x축 --
y축 개수: 3
-- 8번째 x축 --
y축 개수: 4
-- 9번째 x축 --
y축 개수: 5
0 1 2 3 4
0 1 2 3
0 1 2
0 1
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
*/
위의 예제를 stack영역의 2차원 배열로 생성했다면 총 180바이트 (9 * 5 * 4바이트)가 필요하다.
하지만 heap영역에 동적 할당하여 위와 같은 2차원적인 배열 구조를 생성한다면 총 116바이트 ((15 * 2 -1) * 4바이트) 만 있으면 된다.
'Programming > C' 카테고리의 다른 글
[C] typedef (0) | 2020.06.14 |
---|---|
[C] 3차원 배열 같은 3차원 포인터의 동적 할당 (0) | 2020.06.13 |
[C] 동적 할당으로 간단히 구현해본 stack (0) | 2020.06.13 |
[C] 동적 할당 (malloc, free) (0) | 2020.06.11 |
[C] 2차원 배열의 주소 값을 저장할 수 있는 포인터 (0) | 2020.06.10 |
Comments