| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 웹
- 운영체제
- 코딩테스트사이트추천
- 코테공부
- 1일1코테
- 티스토리챌린지
- 데이터베이스
- 프로그래머스
- 프로그래밍 언어
- 개발자취업
- 연결 리스트
- til
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- C
- 항해99
- 갭체크
- 자료구조
- 99클럽
- 플로이드-워셜
- 코딩테스트
- 코드트리
- 자바
- 코딩테스트준비
- 알고리즘
- Java
- 인접 행렬
- 개발자루틴
- 자바스크립트
- 파이썬
- 오블완
- Today
- Total
와드의 블로그
16. 메모리 할당 본문
(1) 프로세스와 메모리 할당
* 프로그램과 프로세스
C 언어로 작성한 소스 파일은 컴파일과 링크를 거쳐서 실행 파일이 된다. 이렇게 프로그래머가 만든 실행 파일을 프로그램이라고 부른다. 그런데 실행 파일에 있는 명령들을 CPU가 직접 실행할 수 없다. CPU가 이 명령들을 실행하려면 먼저 운영체제가 실행 파일의 명령들을 읽어서 메모리에 재구성하는 데, 이를 프로세스라고 한다. 프로세스는 명령들 뿐만 아니라 다양한 메모리 공간을 포함하는데 이러한 공간을 세그먼트라고 한다.
- 코드 세그먼트: 실행 파일의 명령들을 복사해 저장하는 부분
- 데이터 세그먼트: C 언어에서 사용한 문자열 상수나 전역 변수, static 변수가 이 영역에 저장된다.
- 스택 세그먼트: 프로그램 실행 중에 필요한 임시 데이터를 저장하는 데 사용되는 영역으로 지역 변수가 놓이는 스택과 동적으로 할당되는 메모리 공간인 힙으로 구성된다.
* 메모리 할당이란?
운영체제가 데이터를 저장할 메모리 공간을 적적하게 나누는 작업이다. 운영체제는 필요한 크기만큼 적절하게 메모리를 할당해야 메모리가 부족하지 않는다.
* 정적 메모리 할당
컴파일러가 코드를 기계어로 번역하는 시점에서 변수에 저장할 메모리 위치를 배정하는 것을 정적 메모리 할당이라고 한다. 메모리 할당 기준이 C 언어 코드가 기계어로 번역되는 시점에 결정되기 때문에 정적 할당된 메모리 크기나 개수를 변경하려면 코드를 변경하고 다시 컴파일해야 한다.
※ 변수가 메모리에 유지되는 시간
전역 변수는 프로그램이 시작해서 종료할 때까지 할당받은 메모리 상태를 계속 유지해야 하고, 프로그램이 실행되는 도중에 새롭게 전역 변수를 추가하거나 삭제할 수 없다. 전역 변수를 저장하는 공간은 프로세스의 데이터 세그먼트에 별도로 마련되어 있다. 반면 지역 변수는 함수가 호출될 때 메모리에 할당되었다가 함수가 끝나면 메모리 할당이 해제된다.
(2) 동적 메모리 할당 및 해제
* 정적 메모리 할당의 한계
프로세스 안에서 지역 변수가 저장되는 기본 스택의 메모리 크기는 1 Mbyte이다. 그런데 프로그램에서 사용하는 데이터는 당연히 1 Mbyte보다 훨씬 더 큰 경우가 많다. 따라서 더 큰 메모리를 사용할 수 있는 방법이 필요하다.
* 동적 메모리 할당이란?
프로세스는 더 큰 메모리를 할당해서 사용할 수 있도록 힙이라는 공간을 제공한다. 힙에서는 프로그래머가 원하는 시점에서 원하는 크기만큼 메모리를 할당할 수 있다. 그리고 메모리 사용이 끝나면 언제든지 할당한 메모리 공간을 해제할 수 있다. 이런 형식의 메모리 할당을 동적 메모리 할당이라고 한다.
* malloc과 free
힙은 스택처럼 관리되는 공간이 아니라서 변수를 선언하는 행위로 메모리를 할당할 수 없다. 그래서 동적 메모리 할당을 지원하는 C 표준 함수인 malloc을 사용해서 메모리를 할당한다. 예를 들어 힙에 100바이트의 메모리를 할당하고 4바이트 단위로 사용하려면 다음과 같이 malloc 함수를 사용한다.
int* p = (int*)malloc(100);
힙에 할당한 메모리는 프로그램이 끝날 때 자동으로 해제되지 않는다. 따라서 다음과 같이 free함수를 사용하여 힙에 할당했던 메모리를 명시적으로 해제해주어야 한다.
free(p);
(3) 동적 메모리 사용하기
* 배열과 비슷한 형식으로 동적 메모리 사용하기
다음과 같이 메모리를 동적 할당하면 배열과 같은 목적으로 사용할 수 있다.
int* p = (int*)malloc(sizeof(int) * 5); // int arr[5]; 와 비슷한 형태의 사용
* malloc 함수를 이용하여 메모리 할당의 크기를 변수로 받기
다음과 같이 malloc 함수를 이용하면 사용자가 입력한 만큼 메모리를 할당해서 사용할 수 있다.
int data;
scanf("%d", &data);
int* p = (int*)malloc(sizeof(int) * data);
참조자료: C언어 입문
'프로그래밍 언어 > C' 카테고리의 다른 글
| 18. 구조체 (0) | 2021.09.17 |
|---|---|
| 17. 다차원 포인터 (0) | 2021.09.17 |
| 15. 배열과 포인터 (0) | 2021.09.17 |
| 14. 표준 입력 함수 (0) | 2021.09.16 |
| 13. 포인터 (0) | 2021.09.16 |