반응형
#12.1 동적할당 개요
정적 메모리 할당
프로그램 실행 전에 변수의 메모리 할당 크기가 정해지고 메모리 할당 크기가 실행하는 중에 변하지 않는 방식을 정적 할당이라고 한다.
- 지금까지는 "변수 선언"을 통해서 기억 장소를 확보했다.
- 변수는 코드 작성 단계에서 정해지고, 할당되는 메모리 크기는 프로그램을 실행할 때마다 일정하다.
char ch; // 1 바이트 - 일반 변수
int score[10]; // 40 바이트 - 배열 변수
struct student {int id; float avg;} st1; // 8 바이트 - 구조체 변수
int *pi; // 4 바이트 - 포인터 변수
정적 할당 방식의 문제점
- 필요한 메모리 크기를 모를 때, 최대로 큰 크기를 가정해서 변수를 선언해야 한다.
- 프로그램 실행 전 메모리의 필요 크기를 알 수 없으면 메모리 낭비가 발생한다.
동적(dynamic) 메모리 할당
프로그램을 실행하는 동안 결정되는 크기에 따라 메모리를 할당하는 방식
- 메모리를 효율적으로 사용할 수 있다.
#12.2 동적 메모리 사용 절차(1)
메모리 사용 절차
(동적, 정적 모두 해당됨)
- 메모리 사용을 위해서는 메모리를 할당하고 해제하는 과정이 필요하다.
- 할당: 필요한 메모리를 시스템으로부터 받기
- 사용: 할당된 메모리 사용
- 해제: 사용이 끝난 메모리를 시스템에 반납
- 정적 할당 vs. 동적 할당
- 정적 할당: 위의 과정이 프로그램과 함수의 실행 및 종료에 따라 자동으로 수행된다.
- 동적 할당: 프로그래머가 필요한 과정을 코드에 명시적으로 작성해주어야 한다.
동적 할당 기본 예제
동적으로 메모리를 할당하고 해제하는 라이브러리 함수는 <stdlib.h> 헤더 파일에 선언되어 있다.
#include <stdlib.h> // 동적 메모리 관련 함수 사용을 위한 헤더
int main() {
int *p = NULL; // 동적 메모리 접근을 위한 포인터 변수
p = (int *) malloc(5*sizeof(int)); // 동적 메모리 할당
p[0] = 1; // 동적 메모리 사용: 배열 형태
*(p+2) = 3; // 동적 메모리 사용: 포인터 형태
free(p); // 동적 메모리 해제
return 0;
}
동적 메모리 할당: malloc() 함수
인자로 요청된 크기의 연속된 메모리 할당(memory allocation)
함수 원형 | void * malloc(unsigned int size); |
함수 인자 |
|
기능 및 반환 값 |
|
- void*: 특정 자료형을 나타내지 않는 주소를 의미(13.6절)
- ※ void(반환 값이 없음)와 혼동하면 안 된다.
- 주소를 반환한다고 해석해야 한다.
정수 2개를 저장할 공간 할당
malloc(2*sizeof(int));
malloc(8); // 8 바이트 할당
문자 3개를 저장할 공간 할당
malloc(3*sizeof(char));
malloc(3); // 3 바이트 할당
동적 메모리 연결
동적 메모리는 변수 이름을 붙일 수 없기 때문에 포인터 변수를 이용해 간접적으로 참조
자료형 * 포인터_변수명 = NULL;
포인터_변수명 = (자료형 *) malloc(메모리_크기);
// 자료형 -> 사용하고자 하는 자료형으로 명시적 형 변환
// malloc(메모리_크기) -> 할당된 메모리를 어떤 자료형으로 사용할 지 모르므로 (void *)형 변환
int *p = NULL;
p = (int *) malloc(10*sizeof(int)); // int 형으로의 강제 형변환, 40 바이트 할당
동적 메모리 사용
- 할당된 메모리를 포인터 변수에 연결한 후에는 9장 포인터에서 배운대로 사용
ex. 크기가 10인 배열처럼 사용
int *p = (int *) malloc(10*sizeof(int));
// 변수 선언과 동시에 동적 할당된 주소 대입
p[0] = 1; // *p = 1 과 동일
*(p+2) = 3; // p[2] = 3; 과 동일
정리
- 값을 저장하기 위해 필요한 기억 장소를 확보하는 것을 메모리 할당이라고 하고, 정적 메모리 할당과 동적 메모리 할당, 두 가지로 구분된다.
- 동적 메모리 사용 절차는 동적 메모리 할당, 동적 메모리 사용, 동적 메모리 해제의 세 단계로 구성된다.
- malloc() 함수는 메모리를 동적으로 할당하고, 인자로 할당할 메모리의 크기를 전달한다.
- 동적 할당된 메모리 영역은 이름이 없기 때문에, 포인터 변수에 연결해서 사용한다.
반응형
'Algorithm > C프로그래밍' 카테고리의 다른 글
[6주차] 구조체 (0) | 2021.11.09 |
---|---|
[10주차] 동적 할당 (4) | 2021.11.05 |
[5주차] 문자열 (0) | 2021.09.29 |
[4주차] 문자열 (0) | 2021.09.27 |
[2주차] 포인터(3), (4) (4) | 2021.09.13 |