C, C++

11. C언어 메모리 동적 할당

Yongs12 2023. 6. 1. 17:34

메모리 동적 할당 : 프로그램 실행 중에 메모리가 필요할 경우에 사용되며 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 메모리 주소 확인

동적할당을 받은 ptr의 메모리 주소




2. 배열과 같이 Index를 통해 값을 넣은 상황 확인

왼쪽부터 ptr[0], ptr[1], ptr[2] 에 10의 값이 16진수로 들어갔다.




3. free( ) 로 메모리 해제를 할 때 동적할당된 메모리 앞뒤로 fd, fd, fd, fd로 구분이 되어 있다.

동적할당된 메모리를 앞 뒤로 fd,fd,fd,fd로 막아진 모습


FD ( Free Descriptor ) : 동적으로 할당된 메모리 공간이 해제된 후 다시 사용할 수 있도록 관리하는 구조체이다.

동적할당된 공간을 Free Descriptor List에 추가하여 해제된 공간을 다른 프로세스가 메모리 공간을 요청할 때 List에 있는 공간을 할당하게 된다.  

Fd라는 바리게이트를 통해 동적할당 공간을 벗어났는지 감지한다.



버퍼 오버플로우 예시


만약 동적할당된 공간을 넘어서 접근하여 사용하게 된다면 버퍼 오버플로우 에러가 발생한다.

int main(void)
{
	int* pInt = (int*)malloc(sizeof(int) * 3);

	pInt[0] = 10;
	pInt[1] = 10;
	pInt[2] = 10;

	// 동적할당된 공간을 넘어서 사용
	*(pInt + 4) = 10;

	return 0;
}

 

동적할당된 공간을 넘어서 사용



버퍼 오버플로우 에러가 발생