IT 프로그래밍/C

동적 메모리 할당

기술1 2024. 8. 19. 21:45
반응형

변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있습니다. 이것을 동적 메모리 할당이라고 부릅니다. malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환합니다. 

 

#include <stdio.h>

int main(void)
{
	int* p;
	p = (int*)malloc(40);
	if (p = NULL) {
		/* 동적 메모리 할당이 실패*/
		/* 적절한 조치를 취한다*/
	}
	p[0] = 12;
	p[1] = 24;
	*(p + 2) = 36;
}

malloc이 반환하는 주소는 타입이 없는 주소(void *)입니다. 정수들을 저장하기 위해서 이것을 int * 로 변환합니다. 할당받을 메모리의 크기를 byte단위로 지정합니다. 여기서는 10개의 정수를 저장하기 위해서 40바이트를 요청하였습니다.

 

p[0] = 12; 이처럼 malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용합니다. 

 

 

배열 키우기

동적으로 할당된 배열은 공간이 부족한 경우 더 큰 배열을 할당하여 사용할 수 있습니다. 

#include <stdio.h>

int main(void)
{
	int* array = (int*)malloc(4 * sizeof(int));
	array[0] = 1;
	array[1] = 2;
	array[2] = 3;

	int* tmp = (int*)malloc(8 * sizeof(int));
	int i;
	for (i = 0; i < 4; i++)
		tmp[i] = array[i];

	array = tmp;
}

하지만 이런 경우 원래 코드는 어떻게 되는지 의문이 듭니다. 더이상 원래의 4칸짜리 주소는 어디에도 없게 됩니다. 어떤 프로그램이 할당을 받았지만 그 메모리의 주소를 아무도 가지고 있지 않기 때문에 Garbage 즉 쓰레기값이 되는 것입니다. 그렇기 때문에 이것이 당장의 프로그램의 오류를 일으키지는 않습니다.

 

하지만 메모리를 할당받아서 쓰지 않고 계속 가지고 있기 때문에 필요 이상의 메모리를 사용하고 있는 것이고 이는 프로그램의 성능에 문제를 일으킬 수 있습니다. 

 

 

반응형