본문 바로가기
[C language] C 언어

c언어 총정리8 - 메모리 관리와 동적 할당 - malloc, calloc, realloc, free 함수

by codeomni 2023. 9. 1.
반응형

 

메모리 구성

 

프로그램 실행 시 운영체제에 의해 마련되는 메모리의 구조는

코드, 데이터, 힙, 스택 영역으로 구분된다.

 

코드 영역 - 프로그램의 코드가 저장, CPU가 저장된 명령문을 하나씩 가져가서 실행

데이터 영역 - 전역변수와 static으로 선언된 변수가 할당, 프로그램 종료 시 까지 남아있다.

스택 영역 - 지역변수와 매개변수가 할당, 함수의 종료 시 소멸

힙 영역 - 원하는 시점에 변수를 할당, 소멸하는 변수

 


메모리 동적 할당

 

하나의 전역변수(배열) 사용하면 함수를 호출하게 되면 얻게 된 정보를 유지되지 않는다.

힙 영역에서 함수가 매번 호출 시 새롭게 할당되고, 함수 종료 시 유지되는 변수를 생성한다.

 


malloc, free 함수

 

힙 영역의 메모리 공간의 할당과 해제를 하고, 함수의 호출 위치 및 시점에는 제한이 없다.

malloc함수로 메모리 공간을 할당하고, free함수로 해제를 한다.

 

1
2
3
4
#include <stdio.h>
 
void * malloc(size_t size);
void free(void * ptr);

 

malloc 함수는 인자로 전달된 정수 값에 해당하는 바이트 크기의 메모리 공간을

힙 영역에 할당한 후 메모리 주소 값을 반환한다.

동적할당으로 메모리의 크기를 컴파일러가 결정하지 않고,

프로그램의 실행 중간에 호출되는 malloc 함수가 결정한다.

 

malloc 함수의 반환형은 void으로, 반환 값에 가공하지 않으면 할당된 메모리 공간에 접근 불가능하다.

따라서, 사용의 방법은 포인터 형의 변환을 통해서 직접 결정해야한다.

 

1
2
3
4
5
int * ptr = (int *)malloc(sizeof(int));
if (ptr == NULL)
{
    // 메모리 할당 실패에 따른 에러 처리
}

 

malloc 함수는 메모리 공간의 할당의 실패할 경우 NULL을 반환한다.

위의 예제를 통해 성공 여부를 확인할 수 있다.

 


calloc 함수

 

malloc 함수의 차이점은 메모리 공간의 할당을 위한 인자의 전달방식과,

할당된 메모리 공간을 모든 비트를 0으로 초기화한다.

malloc은  120바이트를 할당, calloc은 4바이트 30개를 할당한다는 의미이다.

 

1
2
3
#include <stdio.h>
 
void * calloc(size_t elt_count, size_t elt_size);

 

성공 시 할당된 메모리의 주소 값, 실패 시 NULL을 반환한다.

calloc 함수는 첫 번째 전달인자로 할당할 블록의 갯수 정보가 전달,

두 번째 전달인자로 블록 하나당 바이트 크기의 정보가 전달된다.

 


realloc 함수

 

힙 영역에 할당을 하기 때문에, 메모리 공간의 확장이 가능하다.

함수호출의 성공 시 새로 할당된 메모리의 주소 값이 반환, 실패 시 NULL이 반환한다.

 

1
2
3
#include <stdio.h>
 
void * realloc(void * ptr, size_t size);

 

첫 번째 전달인자로 확장하는 힙 메모리 시작주소 값을 전달,

두 번째 전달인자는 확장하는 메모리의 전체 크기를 전달한다.

매개변수 ptr과 size를 사용해서 ptr이 가리키는 메모리의 크기를 size 크기로 조절한다.

 

확장하는 영역이 충분하지 않을 경우, 힙의 다른 위치에서 새 메모리 공간을 별도로 할당해서 반환한다.

따라서, malloc함수와 realloc함수가 반환한 주소값이 다른 경우도 있다.

 

댓글