컴퓨터 프로그래밍/C

C언어 메모리 동적 할당 (malloc)

나노콛 2019. 7. 23. 11:30

메모리 동적할당은 
필요한 만큼 공간(메모리)을 할당을 하는 건데요

이 동적할당으로 할당된 메모리는 Heap 영역에 할당됩니다.

메모리 동적할당을 사용하는 이유는

1. 원하는 만큼 공간을 사용할 수 있다.
2. 메모리 관리에 효율적이다.

일반적으로 int a[10]; 이렇게 선언을 했다고 합시다.
이럴 때 배열을 모두 사용하지 않을 경우가 생긴다면 불필요한 메모리 할당이 됩니다.

또한 해당 자료형에 필요한 공간이 나중에 지금 설정된 메모리보다 늘어나게 된다면?
써야 할 공간을 쓰지 못하게 되는 일이 생길 수 있을 것입니다.

이 문제를 해결할 수 있는 게 동적 할당입니다.

 

//아래의 헤더파일중 하나만 써도 됩니다.
#include <malloc.h> 
#include <stdlib.h>
//혹은 최신버전의 비주얼스튜디오는
#include <stdio.h> // 여기에 선언되어 있습니다.

malloc(양의정수); //함수의 인자는 unsigned int형이 들어갑니다.

malloc() 함수는 반환형이 viod * 형입니다.
그 말은 viod형 포인터 형태로 반환이 되는데요
포인터는 주소를 담는 공간입니다.

형태가 정해져 있지 않은 메모리의 시작 주소가 반환이 됩니다.
그것을 사용하기 위해서는 캐스팅 연산자를 이용해서 형 변환을 해서 사용할 수 있습니다.

(주솟값에 캐스팅을 해서 써야 하는 이유
사용할 형태의 자료들을 읽어올 때 저장된 바이트만큼 불러오기 위해서

또한 동적할당을 하고 나면
사용 후 
free() 함수로 메모리를 초기화 시켜줘야 합니다.
free() 함수의 인자 값은 malloc() 함수에서 반환된 주소가 들어갑니다.

 

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

int main()
{
	int* ptmp = malloc(100); //캐스팅연산자가 빠져있다.

	int* ptmp2 = (int*)malloc(100); //정상적인 표현
                         //포인터형으로 저장하는 이유는 주소값이 반환되기 때문
	free(ptmp);
	free(ptmp2);

	return 0;
}

위의 코드에 문제가 있습니다.
원하는 만큼 메모리 할당을 해야 하는데
malloc(100)으로는 그것을 해결할 수 없습니다.

그래서 보통은

malloc(sizeof(int)*2); //int형 변수 2개 담을 공간이 필요하다면

이런 식으로 할당을 하게 됩니다.

 

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

int main()
{
	int i = 0;
	int* pTmp = (int*)malloc(10);
	char* pCh = (char*)malloc(20);

        pTmp[0] = 10;
        pTmp[1] = 20;
        pTmp[2] = 30; //메모리 부족으로 오류

	printf("Sum : %d\n", pTmp[0] + pTmp[1]);

	for (i; i < 10; i++)
	{
		pCh[i] = 'a' + i;
	}
	pCh[i]='\0'; //초기화 시 쓰레기값이 들어가 있어서 출력이 이상하게 되는것을 방지
	printf("%s\n", pCh); //해당주소에서 null문자 까지 출력됨.

	free(pTmp);
	free(pCh);
	return 0;
}

int형 자료를 담을 메모리 할당이 10바이트만 할당되어 있어서
pTmp[2]에는 값을 넣을 수 없습니다.
그래서 이 문제를 해결하려면
int* pTmp = (int*) malloc(sizeof(int)*3);
이렇게 할당하게 되면 int형 3개를 제대로 담을 수 있습니다.

728x90