상세 컨텐츠

본문 제목

c언어 동적 메모리 -3일차 첫 번째

코딩

by Davinc2 2022. 12. 7. 20:44

본문

정적 메모리 할당의 한계

 

함수를 호출할 때 지역 변수가 할당되는 메모리 공간은 최대 1Mbyte를 넘을 수 없습니다.

컴파일러는 자신이 컴파일한 프로그램이 스택을 얼마나 사용할지 예상할 수 없습니다.

 

더 큰 메모리를 사용할 수 있는 방법이 필요합니다.

 

동적 메모리 할당

 

프로세스는 더 큰 메모리를 할당해서 사용할 수 있도록 힙이라는 공간을 제공한다

 

스택은 '스택 프레임'규칙을 통해 코드가 컴파일될 때 사용할 메모리 크기를 결정합니다.

하지만 힙은 스택 프레임과 같은 형식이 적용되지 않으며 프로그래머가 원하는 시점에 원하는

크기만큼 메모리를 할당할 수 있다. 

그리고 메모리 사용이 끝나면 언제든지 할당한 메모리 공간을 해제할 수 있습니다.

이것을 '동적 메모리 할당'이라고 합니다.

Gbyte까지 할당 가능하다.

 

 

molloc 함수로 동적 메모리 할당하기

힙은 스택처럼 관리되는 공간이 아니라서 변수를 선언하는 행위로 메모리를 할당할 수 없습니다.

동적 메모리 할당을 지원하는 c표준 함수인 malloc을 사용해서 메모리를 할당해야 합니다.

 

이 함수는 사용자가 size 변수에 지정한 크기만큼 힙 영역에 메모리를 할당하고

그 할당된 주소를 void *형식으로 반환해 줍니다.

 

    함수  원형: void *malloc(size_t size);    //size_t는 unsigned int 와 같은 자료형

함수 사용 형식:void *p = malloc(100); //100바이트의 메모리를 할당하여 포인터 p에 저장함

 

100메모리를 할당해도 2바이트로 50개,4바이트로 25개 사용할지는 예상할 수 없습니다.

 

그래서 malloc함수가 메모리의 사용 단위를 결정하지 않고 void *형식으로 주소를 반환해 주는 것이다.

 

void *를 사용할떄마다 형변환을 해야 하는 불편함이 있다.

그래서 미리 형 변환을 해주는데 

short *p = (short *)malloc(100);        int *p =(int *)malloc(100); 이렇게 사용 가능하다.

 

free함수로 할당 메모리 해제

 

스택에 할당한 지역 변수는 함수 호출이 끝나면 스택 프레임에 의해 자동으로 해제된다.

하지만 힙에 할당한 메모리는 프로그램이 끝날 떄까지 자동으로 해제되지 않는다.

free함수를 사용하여 해제해줘야한다.

free(p);  //p가 가지고 있는 주소에 할당된 메모리를 해제함

 

#include <malloc.h>추가해야 사용 가능합니다.

 

int p[3] 

int *p = (int *)malloc(12);  위와 아래는 서로 비슷하다고 생각

 

sizeof연산자

메모리 사용 단위까지 적을 수 있습니다.

 

int *p = (int *)malloc(sizeof(int) * 3)    //sizeof(int) * 3 == 12

 

사용하려는 단위를 알 수 있다.

 

정적 메모리 할당을 사용했을떄 발생할 수 있는 문제점

 

친구관리 프로그램을 만들었다 치자

친구가 없는 프로그램 사용자는 배열 크기가 10으로도 충분하지만 300명인 사용자는 최대 크기인 300으로

배열 크기를 정해야 한다. 그러나 이러면 친구가 10명인 사람은 290개의 배열 요소를 낭비하는 셈이다.

친구가 500명인 사람은 프로그램을 사용조차 하지 못한다.

이 문제는 배열이 정적 메모리 할당 방식을 사용하기 떄문에 배열의 크기를 상수로만 받아서

생기는 것입니다.

 

이러한 낭비를 막기 위해 동적 메모리 할당을 사용한다.

배열과 달리 malloc은 함수이기 떄문에 할당할 크기를 적을 때 상수뿐만 아니라 변수도 사용할 수 있다.

int data_size = 12;

int *p = (int*)malloc(data_size);   //12바이트 메모리가 동적 할당됨

 

오늘은 여기까지 

관련글 더보기