11. C언어 메모리 동적 할당
메모리 동적 할당 : 프로그램 실행 중에 메모리가 필요할 경우에 사용되며 Heap 영역에서 할당이 이루어 진다.
메모리 동적 할당 함수
1. malloc( ) : 메모리 공간을 동적으로 할당할 때 사용하는 함수로 메모리 공간을 할당할 때 매개변수로 요청한 크기만큼의 메모리 공간을 할당한다.
// 예시
int *ptr = (int*)malloc(sizeof(int));
// 사용 후에는 반드시 메모리 해제를 해야한다.
free(ptr);
2. calloc( ) : malloc( )과 비슷하지만 할당된 메모리 공간을 0으로 초기화 하여 반환하며 매개변수로 할당할 개수와 각 요소의 크기를 입력받는다.
int *ptr = (int*)calloc(10, sizeof(int));
// 사용 후에는 반드시 메모리 해제를 해야한다.
free(ptr);
3. realloc( ) : 기존에 할당된 메모리 공간의 크기를 변경할 때 사용하는 함수로 매개변수로 기존의 메모리 공간의 포인터와 새로운 크기를 입력받는다.
int *ptr = (int*)malloc(sizeof(int));
ptr = (int*)realloc(ptr, 2 * sizeof(int));
// 사용 후에는 반드시 메모리 해제를 해야한다.
free(ptr);
메모리 동적 할당을 하고 난 후에는 반드시 free( ) 함수를 이용하여 메모리 해제를 시켜줘야 한다.
Debug를 통한 메모리 상태 확인
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// int(4Byte) * 3 = 12Byte 동적할당
int* ptr = (int*)malloc(sizeof(int) * 3);
// 배열과 같이 Index를 통해 접근이 가능하다.
ptr[0] = 10;
ptr[1] = 10;
ptr[2] = 10;
// 메모리 해제
free(ptr);
return 0;
}
1. ptr 메모리 주소 확인
2. 배열과 같이 Index를 통해 값을 넣은 상황 확인
3. free( ) 로 메모리 해제를 할 때 동적할당된 메모리 앞뒤로 fd, fd, fd, fd로 구분이 되어 있다.
FD ( Free Descriptor ) : 동적으로 할당된 메모리 공간이 해제된 후 다시 사용할 수 있도록 관리하는 구조체이다.
동적할당된 공간을 Free Descriptor List에 추가하여 해제된 공간을 다른 프로세스가 메모리 공간을 요청할 때 List에 있는 공간을 할당하게 된다.
버퍼 오버플로우 예시
만약 동적할당된 공간을 넘어서 접근하여 사용하게 된다면 버퍼 오버플로우 에러가 발생한다.
int main(void)
{
int* pInt = (int*)malloc(sizeof(int) * 3);
pInt[0] = 10;
pInt[1] = 10;
pInt[2] = 10;
// 동적할당된 공간을 넘어서 사용
*(pInt + 4) = 10;
return 0;
}