C-Language/Memory Managements

Memory Management in C language

Soul-Learner 2016. 11. 19. 21:23

C 언어 동적 메모리 할당


C 언어에서 배열을 생성할 때는 배열의 크기를 반드시 상수로 지정해야 한다. 즉, 배열은 컴파일시에 그 크기가 결정되어야 한다는 것이다. 프로그램 실행시에 배열의 크기를 결정할 수 없다는 의미이기도 하다. 그러므로 다음과 같이 배열의 크기가 동적으로 결정되는 코드는 오류를 발생할 것이다

int size = 0;

scanf("%d", &size);

char str[size];  // 동적으로 배열의 크기를 지정하려는 부분, 오류


위의 코드가 의도하는 동적인 메모리 할당을 위해 C 언어에서는 몇가지 함수가 준비되어 있다.

void *malloc(int num);  // num 바이트의 메모리를 동적으로 할당받고 그 주소를 리턴한다

void *calloc(int num, int size);  //size 바이트짜리 num 개의 메모리를 동적으로 할당받아 그 주소를 리턴한다.

void *realloc(void *address, int newsize);  //동적으로 할당된 기존 메모리 크기를 늘리거나 줄인다(기존 데이터는 유지됨)

void free(void *address);  //동적으로 할당된 메모리의 주소를 이용하여 해당 메모리를 해제한다


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

int main()
{
	int memSize = 0;
	printf("동적으로 할당받을 메모리의 크기를 4의 배수로 입력하세요:");
	scanf("%d", &memSize);

	// 동적으로 배열의 크기를 결정하는 것은 C언어에서 오류
	//char str[memSize]; // C언어에서 배열의 크기는 반드시 상수이어야 함

	// 동적으로 할당된 메모리 영역에 정수를 저장하려고 하므로 void * 형을 int * 형으로 형변환한다
	int *p = (int*)malloc(memSize); // 동적으로 memSize 바이트의 메모리를 할당
	int i = 0;

	for (i = 0; i < memSize / 4; i++) {
		p[i] = i;  // 동적으로 할당받은 메모리 영역에 원하는 데이터를 저장한다
		printf("%d ", p[i]);
	}
	printf("\n");

	// 이번에는 동적으로 할당하여 문자를 저장할 계획이므로 void * 형을 char * 형으로 형변환한다
	char *str = (char*)calloc(memSize + 1, 1); // 1바이트 공간 memSize 개를 할당 받는다

	srand(time(NULL));
	for (i = 0; i < memSize; i++) {
		str[i] = rand() % 26 + 'a';
	}
	str[memSize] = '\0';
	printf("%s \n", str);

	// 기존 동적할당된 메모리의 크기를 재조정한다(더 크게 혹은 작게)
	// 기존 데이터는 그대로 유지됨
	p = realloc(p, 2*sizeof(int));
	printf("%d, %d \n", p[0], p[1]);

	free(p);   // 동적으로 할당된 메모리를 해제함
	free(str);

	return 0;
}