- 메모리 영역
- 스택
-> 지역 변수- 힙
-> 동적 할당 메모리- 데이터
-> 전역/정적/외부 변수- ROM (CODE/DATA)
정적 할당
: 스택, 데이터 영역은 함수가 호출될 때/프로그램이 실행될 때 메모리 할당이 정해진다.
동적 할당
: Heap 영역은 프로그램 실행 도중에 실시간 대응이 가능하다.
- 동적 할당/해제 방법
- C : malloc() , free() 👉 함수
- C++ : new, delete 👉 키워드
: 메모리 할당 함수
사용자가 지정한 크기만큼 힙 영역에 메모리를 할당시켜 준다.
함수 원형
void * malloc(size_t _Size)
👉 malloc() 함수는 입력 인자로 바이트 수를 요청받는다.
요청받은 메모리를 할당해 주고 단순히 그 주소를 넘겨주기만 하는 역할일 뿐이지,
이 메모리 공간이 어떤 타입으로 사용될지는 사용자가 포인터 타입을 통해 직접 결정하기 때문에 주소를 void 포인터로 반환한다.
int* pInt = (int*)malloc(100);
: 힙 영역에 100byte가 생성되고, 그 주소를 포인터 변수로 받음
-> malloc() 의 반환 타입이 void 포인터이기 때문에, int 포인터로 형변환 해준 후 포인터 변수에 주소값을 준다.
float* pF = (float*)malloc(4);
int* pI = (int*)pF;
: 4byte 할당받은 힙 주소를 float 포인터로 받고, 그걸 int 포인터로 가리킴
-> pI, pF 두 포인터 모두 같은 공간의 주소를 가리키고 있음
*pF = 2.4f;
int i = *pI;
-> 부동소수점 방식으로 표현된 2.4f를 정수로 읽게 되었으므로 엄청 큰 수로 표현된다.
free(): 전달받은 주소가 가리키는 곳에 할당되어 있는 힙 메모리를 해제시켜 줌
함수 원형
void free(void* ptr);
예시
int iInput = 0;
scanf_s("%d"m &iInput);
int* pInt = nullptr;
if (100 == IInput)
{
pInt = (int*)malloc(100);
}
if(nullptr != pInt)
{
free(pInt); //힙 메모리 해제
}
return 0;
함수 예시
void Test(int a)
{
printf("%d\n", a);
}
동적할당 에시
int iInput = 0;
scanf_s("%d", &iInput);
if (100 == IInput)
{
malloc(100);
}
동적 할당의 활용
-> 가변 배열(다음 포스트)
[참고]
https://youtu.be/3QIbwZVh-oU
https://youtu.be/v2NUpzV6bpE
정적 할당&동적 할당
정적 할당vs동적 할당
C++ 2차원 vector 동적할당하기