C

동적할당

왕건 2026. 3. 6. 20:13

 

 

코드 섹션과 데이터 섹션 

 

코드 섹션 : 우리가 작성한 소스코드들이 빌드된 결과물들이 저장되는 곳

데이터 섹션 : 전역 변수와 정적 변수 등이 저장되는 곳


스택메모리의 단점

 

1. 스택메모리에 저장되는 지역변수의 크기는 컴파일때 고정된다. 런타임 때 늘리거나 줄일 수 없다.

2. 함수가 종료되면 종료된 함수 스택 프레임에 접근이 불가능하다. 즉, 함수 안에 지역변수는 함수가 종료될 시 같이 사라진다.

3. 지역변수가 사라지는 걸 막기위해 전역변수 혹은 정적변수로 선언해야 하지만 그건 또 너무 그것대로 과분하다.


스택 메모리의 단점을 없앨 힙 메모리에 대해

 

프로그래머가 관리할 수 있는 동적 할당 영역이다.

엄연히 스택 메모리와는 다르다.

프로그래머가 원하는 만큼 원하는 때에 할당 및 반납이 가능하다.


무적은 아닌 힙 메모리의 단점

 

1. 스택메모리에 비해 할당/해제 속도가 느리다.

2. 효율적인 메모리 관리가 어렵다(까다롭다)

3. 프로그래머가 직접 메모리 할당 및 해제를 해야한다. (할당만 하고 해제를 하지않는 실수의 여지가 있음.)


중요한 동적 할당의 세 가지 단계

 

1. 메모리 할당(대여)

힙 메모리 관리자에게 필요한 바이트만큼의 메모리를 달라고 요청한다.

힙 메모리 관리자는 해당 크기의 연속된 메모리를 찾아서 반환한다.

반환된 값은 시작 메모리 주소이다.

 

2. 메모리 사용

할당된 힙 메모리 시작 주소를 가지고 원하는 작업을 수행

이때 할당된 메모리 속 데이터는 쓰레기값이 들어있음.

 

3. 메모리 해제(반납)

힙 메모리 관리자에게 해당 메모리 주솔를 돌려주며 다 썼다고 알림.

관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꿈.

메모리를 돌려주지 않으면 누수가 발생하기 때문에 꼭 반납하여 해제하는 것이 중요

 

*메모리 누수란?

메모리가 점유 상태를 벗어나지 못해 사용가능한 메모리가 줄어드는 현상이다.


동적 메모리 관련 함수

 

할당: malloc()

void* malloc(size_t size)

 

해제: free()

void free(void* ptr)

 

 

*malloc() 작성했다면 곧바로 free()을 작성하여 메모리 누수를 예방하는 좋은 습관을 들이자.

 

*중요샘플코드*

// Main.c

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	size_t i;
	int* Nums = (int*)malloc(10 * sizeof(int));
	if (NULL == Nums)
	{
		return 0;
	}

	// Do something....

	free(Nums);
	Nums = NULL;

	if (NULL != Nums)
	{
		// TODO.
	}

	return 0;
}