일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C언어 포인터
- vim
- 플러터
- git
- c# winform
- Flutter
- 다트 언어
- jupyter
- Unity
- 도커
- HTML
- C# delegate
- C++
- docker
- Houdini
- github
- Python
- 깃
- c#
- Algorithm
- Data Structure
- 유니티
- c# 윈폼
- gitlab
- c언어
- 구조체
- jupyter lab
- dart 언어
- 포인터
- c# 추상 클래스
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