최상단

컨텐츠

[C] 동적 메모리 할당//

글 정보

Category
컴퓨터 이야기
2007. 4. 10. 00:47

본문

친구 홈페이지에 잠시 갔다가...........
http://join.tistory.com/27
이 글을 보고.............잠시//
Comment 달기엔 내용이 길기에..ㅋㅋ
-------------------------------------------------------------------------------
우선..C언어에서 배열은..
int arr[2][3];
이렇게 선언하면..
   0 1 2
0 ■■■
1 ■■■
이런식으로 메모리가 잡힌다...

그럼............
int *arr[3]으로 선언하면?
어떻게 될까...............................???
int형 포인터 변수..3개가 배열로 생성된다..

곧 그냥 ->> ■■■  이런식으로 생성된다....
단 그 안에 저장되는 내용이 int형 포인터변수를 저장하는 공간이 된다.
이때 arr의 크기는 얼마일까?...............
32비트 컴퓨터를 기준으로 볼때 포인터의 크기는 4바이트니까 4*3=12바이트의 영역을 차지한다.
그럼...
char *arr_ch[3];
로 선언하게 되면?..
char가 1바이트니까...3바이트일까?...
물론 아니다!//
char형 포인터이기때문에.........4*3=12 바이트가 된다..

결국..저장되는 내용은 포인터라는 것이다~..
그럼 아래와 같이 선언하고 각 포인터에 메모리를 할당하게 되면............

int *arr[3];
arr[0] = (int*)malloc(sizeof(int)*4);
arr[1] = NULL;
arr[2] = (int*)malloc(sizeof(int)*3);

메모리 할당 모양
arr[0] ■■■■
arr[1]
arr[2] ■■■

의 형태로 할당된다..그럼 총 사용한 메모리는?
처음
*arr[3]에 할당된 12바이트
arr[0]에 할당된 4*4 = 16바이트
arr[1]에는 없고
arr[2]에 할당된 4*3 = 12바이트
12+16+12 = 총 40바이트가 된다..

링크드 리스트처럼 완전한 동적 메모리 할당은 아니지만...........
어느정도는 동적으로 할당할 수 있는 방법이다.

훔..................한단계 더 업그레이드..하면..
int **arr;
arr = (int**)malloc(sizeof(int*)*10);
이렇게 하면..
int *arr[10]
과 똑같다......................
위에서 static하게 10으로 숫자를 고정하는것보다는..
malloc는 사이즈를 실행도중 변경이 가능하니까...
static보다는 조금 더 유동적으로..............
링크드리스트보다는 쉬운 방법으로............
메모리를 관리할 수 있다~


-------------------------------------------------------------------------------

흠..C에서도 이렇게 되는데...C++이 안될리가..
2차원 배열을 선언하는게 아니라...
포인터 저장할 수 있는 공간을 잡는게 아닐지.........
(물론 C, C++에서는 이 개념이지만..C#에서는 다른 개념일지도....)
잠이 안와서..주저리주저리 써봤음-_-ㅋㅋ

트랙백과 댓글 여닫기

TOP