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인지 체크하여 메모리 할당 실패 상황을 처리해야 함.
사용 예시
2. calloc (Contiguous Allocation)
- calloc은 malloc과 유사하게 메모리를 할당하지만, 할당된 모든 메모리를 0으로 초기화
- calloc은 할당된 메모리를 0으로 초기화하므로 초기값이 필요한 경우 편리
- malloc은 초기화가 필요 없는 경우 속도가 더 빠르며, calloc은 초기화가 필요한 경우에 유
사용 예시
3. free(메모리 해제)
- free는 malloc나 calloc으로 할당된 메모리를 해제 하는 함수
- 이미 해제한 메모리를 다시 해제하려고 하거나, 할당되지 않은 메모리를 해제하려고 하면 오류 바생
- 해제 후 포인터를 NULL로 초기화하여 다른 코드에서 재사용하지 않도록 해야함
사용 예시
'프로그래밍 > C' 카테고리의 다른 글
[C언어-응용문제] 반복문을 사용한 구구단 출력 (3) | 2024.11.07 |
---|---|
[C언어-응용문제] 간단한 계산기 프로그램 만들기 (5) | 2024.11.06 |
[C언어] 12.파일 입출력 (fopen, fclose, fread, fwrite) (3) | 2024.10.25 |
[C언어] 11. 구조체(Structure) (구조체와 배열, 구조체와 포인터) (1) | 2024.10.24 |
[C언어] 10. 포인터 (포인터의 개념, 포인터와 배열, 포인터와 함수(Call by Reference)) (3) | 2024.10.23 |