프로그래밍/C

[C언어] 13. 메모리 관리 동적 메모리 할당 (malloc, calloc, free)

록스타★ 2024. 11. 1. 18:03
반응형

1. 메모리 관리의 기본 개념

- 메모리 구조 : C에서 메모리는 크게 스택, 힙, 데이터, 코드 영역으로 나눈다.

 

스택(Stack) 영역 :

- 함수 호출 시 자동으로 할당되는 메모리 영역으로, 지역 변수와 함수의 매개변수가 저장

- LIFO(Last In First Out) 구조로 작동하며, 함수 호출이 종료되면 해당 함수에서 사용한 메모리가 자동으로 해제

- 할당과 해제 속도가 빠름

- 스택 영역의 크기는 한정되어 있으며, 너무 많은 데이터를 스택에 할당하면 스택 오버플로우가 발생 

 

힙(Heap) 영역 :

- 동적 메모리 할당을 통해 프로그램이 실행되는 동안 필요할 때마다 메모리를 할당할 수 있는 영역

- 프로그램에서 직접 관리해야 하며, malloc, calloc, realloc 함수로 메모리를 할당하고 free로 해제

- 크기와 사용 기간을 유연하게 조정할 수 있어, 실행 중에 필요에 따라 메모리를 할당하고 해제

- 할당한 메모리를 해제하지 않으면 메모리 누수가 발생할 수 있으므로, free를 사용해 메모리를 수동으로 해제

 

데이터(Data) 영역: 

- 전역 변수, 정적 변수(static), 그리고 초기화된 데이터가 저장되는 영역

- 프로그램 시작 시 할당되어 프로그램이 종료될 때까지 유지

- static int count = 10; 과 같은 전역 변수나 정적 변수가 여기에 할당

- 초기화된 변수와 초기화되지 않은 변수를 나누어 관리할 수 있으며, 초기화되지 않은 전역 변수는* BSS(Bloack Started by Symbol)영역에, 초기화된 변수는 데이터 영역에 저장

 

코드(Code) 영역:

- 실행할 프로그램 코드가 저장되는 영역

- 읽기 전용으로 설정되어 있어 코드가 수정되지 않도록 보호

- 프로그램이 시작될떄 로드되며, 일반적으로 변경되지 않는 메모리

- 이 영역을 읽기 전용으로 설정해 코드가 실행 도중 변경되는 것을 막음 

 

* BSS(Block Started by Symbol)영역

- 코드에서 초기값을 명시하지 않은 전역 변수와 정적 변수가 BSS 영역에 저장

- ex) int counter; 와 같은 전역 변수는 초기값을 설정하지 않았기 때문에 BSS 영역에 할당

- BSS 영역에 저장된 변수들은 프로그램 실행 시 자동으로 0으로 초기화

- C언어에서는 초기화하지 않은 전역 변수와 정적 변수들이 안전하게 0으로 초기화된 상태에서 시작할 수 있도록 보장

- 초기화되지 않은 변수를 BSS 영역에 할당하면 실행 파일 크기가 줄어들고, 초기값을 명시적으로 저장할 필요가 없기 때문에 초기화된 데이터와 구분되어 저장

-  BSS 영역에는 초기화되지 않은 전역 변수와 정적 변수가, 데이터(Data) 영역에는 초기값이 명시된 전역 변수와 정적 변수가 저장

- ex) int x = 10; 과 같이 초기화 된 변수는 데이터 영역에 저장되지만, int y;처럼 초기화 되지 않은 변수는 BSS영역에 저장 

 

2. 동적 메모리 할당 (malloc, calloc, free) :

- 동적 메모리 할당은 프로그램 실행 중에 필요한 메모리를 할당하고 해제하는 기능을 제공하는 것으로, 힙(Heap)영역에서수행 

- malloc, calloc, free 함수를 통해 수행

 

1. malloc (Memory Allocation)

- malloc 함수는 요청한 크기만큼 메모리를 할당하고, 할당된 메모리의 시작 주소를 반환

- 할당된 메모리는 초기화되지 않으므로, 메모리 내에 기존에 남아있던 데이터가 그대로 존재

- malloc은 할당 실패 시 NULL을 반환하므로, 반환값이 NULL인지 체크하여 메모리 할당 실패 상황을 처리해야 함.

 

사용 예시

int *arr = (int*)malloc(10 * sizeof(int)); // int형 10개를 저장할 수 있는 메모리 할당
if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1; // 메모리 할당이 실패한 경우
}

 

 

2. calloc (Contiguous Allocation)

- calloc은 malloc과 유사하게 메모리를 할당하지만, 할당된 모든 메모리를 0으로 초기화

- calloc은 할당된 메모리를 0으로 초기화하므로 초기값이 필요한 경우 편리

- malloc은 초기화가 필요 없는 경우 속도가 더 빠르며, calloc은 초기화가 필요한 경우에 유

 

사용 예시

int *arr = (int*)calloc(10, sizeof(int)); // int형 10개를 저장할 수 있는 메모리 0으로 초기화하여 할당
    if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
    }

  

 

3. free(메모리 해제)

- free는 malloc나 calloc으로 할당된 메모리를 해제 하는 함수

- 이미 해제한 메모리를 다시 해제하려고 하거나, 할당되지 않은 메모리를 해제하려고 하면 오류 바생

- 해제 후 포인터를 NULL로 초기화하여 다른 코드에서 재사용하지 않도록 해야함

 

사용 예시

free(arr); // 할당한 메모리 해제
    arr = NULL; // 해제 후 포인터를 NULL로 초기화

 

반응형