프로그래밍과 잡담

[C언어] 기초 8 본문

프로그래밍/C,C++, Win32Api

[C언어] 기초 8

크레온 2009. 3. 14. 14:03
동적 할당(Memory Allocation)

 자 인제 이것만 하면 다 한거 같네..

동적할당 프로그래머가 필요할때 메모리에 올리고 지울때 사용하는게 동적할당이다.

(데이터타입*)malloc(sizeof(크기))

위에 처럼 사용하면 된다. *표는 오타가 아니라 포인터로 반환한다는거다.

아 그러고 보니 형변환 안했네.. 뭐  그냥 지금 하지

*****************************************
형변환
형변환 하는거 쉽다 위에서 써 놓은거 처럼
'(  )' (
캐스트연산자) 여기다가 데이터타입을 넣으면
데이터 타입이 일시적으로 변환된다.
계속 바뀌는것이 아니다.

int i = 43;
printf("%c", (char)i));

위에 처럼 사용하면된다 i를 char형으로 형변환한거다.

묵시적 형변환도 있는데..

int i = 30;
float t ;
t = i /3.1;

이렇게 사용하면  3.1이란거 때문에 float로 변환되서 값이 들어간다.
형변환 설명끝.
******************************************

자, 다시 동적할당으로 와서.

동적할당 예제를 보면 쉽다.

예제)

int *t;

t = (int*) malloc( sizeof(int) * 4);

이렇게 사용하면 된다.

위에 예제는 4개의 배열을 만드는 거다. sizeof 연산자를 이용해서 하는게 좋다.
물론 그냥 숫자를 넣어도 관계는 없지만 sizeof로 하는게 좋은게 아니라 해야한다.


C언어에서는 메모리를 할당했으면 수동으로 해체를 해주어야 한다.
메모리를 할당하고 해체를 해줘야하는 이유는 *메모리 누수(Memory Leack)를 방지 하기 위해서다.

C언어는 수동적이다.  Java나 C#은 갈비지 컬랙션이라는게 있어가지고
메모리 할당을 하고 해체를 안해도 되는데 C는 그런게 없다.
C에도 그런게 있었으면 좋을텐데 말이지...

메모리 해체 방법은 무지 쉽다.

예제)

int *t;

t = (int*) malloc( sizeof(int) * 4);


free(t);

free 라는걸 쓰면 간단하게 메모리가 해체된다.


그리고 realloc 이라는 것도 있다..

줄임말인데 memory reallocation 이다.

사용법은

포인터   =   realloc(포인터 , sizeof( 데이터 타입) * 크기);

위에 포인터는  int * , char * 이런거를 말하는 거다.

그리고 사용예제

예제)

int *t;
size_t size;

t = (int*) malloc( sizeof(int) * 4);

size = _msize(t);

printf("%d\n",size);

t = realloc(t, (10+ sizeof(int)*1000) );

size = _msize(t);

printf("%d\n",size);

free(t);


결과는  16 나오고 4000 나온다.

이렇게 하면 된다.

* 메모리 누수란?
동적할당을 이용해서 변수를 할당을 하면 메모리에 올라간다.
근데 그걸 해체를 안해주면 메모리 안에 남아서 있기때문에 메모리의 용량을
차지하는 사태가 일어나게된다. 나중에는 메모리가 가득차서 프로그램이 실행이 안되는 사태가 일어난다..  근데 그건 옛날 일이고 요즘은 그런거 잘 안일어난다. 임베디드 쪽에서나 일어나지.
요즘 메모리의 용량이 매우커서 프로그램이 실행이 안되거나 하는 일은 없다.
하지만 그렇다고 해서 메모리 해체를 안해주면 안된다.
혹시라도 모를 사태를 대비하기 위해서하는거니까
반듯이 할당을 했으면 해체작업을 하자.

끝..
반응형

'프로그래밍 > C,C++, Win32Api' 카테고리의 다른 글

[C++] 오버로딩(overloading), 오버라이딩(overriding)  (0) 2009.03.31
[C언어] 재귀 함수  (0) 2009.03.14
[C언어] 기초 7-1  (0) 2009.03.14
[C언어] 기초 7  (0) 2009.03.14
[C언어] 기초 6  (0) 2009.03.11
Comments