C_C++

(C언어) 동적메모리 할당: malloc, calloc, realloc, free

고니자니 2022. 10. 20. 10:36
반응형

malloc 

메모리 블록은 할당합니다.

void *malloc(
   size_t size
);

malloc은 실행시간 동안 메모리를 동적으로 할당받습니다.
할당 공간에 대한 void 포인터를 반환하거나 사용 가능한 메모리가 부족한 경우는 NULL을 반환합니다.
void가 아닌 형식에 대한 포인터를 반환하려면 형식 변환을 사용해야 합니다.

 

malloc, calloc, realloc, free 함수를 사용해기 위해서는 다음의 헤더파일을 포함해야 합니다.

#include <stdlib.h>
또는
#include <malloc.h>

 


다음 코드는 정수를 입력받고, 입력 받은 수 만큼 int 크기의 메모리를 할당 받는 예제입니다.

#define _CRT_SECURE_NO_WARNINGS  // Visual Studio 

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	scanf("%d", &n);
	int* ptr = (int*)malloc(sizeof(int));

	for (int i = 0; i < n; i++)
		ptr[i] = i + 1;

	for (int i = 0; i < n; i++)
		printf("%d ", ptr[i]);
	printf("\n");
    
    free(ptr);	// 동적 메모리 해방

	return 0;
}

(Output)

 

calloc

0으로 초기화된 요소(element)가 있는 메모리를 할당 받습니다.

void *calloc(
   size_t number,
   size_t size
);

number: 요소(element)의 수

size: 각 요소의 길이(바이트)

 

위에서 작성한 코드를 calloc로 변경해 보겠습니다.

#define _CRT_SECURE_NO_WARNINGS  // Visual Studio 

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	scanf("%d", &n);
    
	//int* ptr = (int*)malloc(sizeof(int));   // malloc
	int* ptr = calloc(n, sizeof(int));        // calloc
    
	for (int i = 0; i < n; i++)
		ptr[i] = i + 1;

	for (int i = 0; i < n; i++)
		printf("%d ", ptr[i]);
	printf("\n");

    free(ptr);	// 동적 메모리 해방
    
	return 0;
}

(Output)

출력 결과는 malloc 예제와 동일합니다.

 

 

realloc

메모리 블록을 다시 할당합니다.

void *realloc(
   void *memblock,
   size_t size
);

memblock: 이전에 할당된 메모리 블록에 대한 포인터

size: 새 크기(바이트)

 

할당된 새 블록은 다른 위치에 할당될 수 있습니다.

realloc 함수는 크기가 증가해도 이전에 할당됨 메모리를 비우지는 않습니다(이전 값을 유지합니다.)

 

 

위에서 작성한 코드를 realloc 함수를 사용해서 다시 수정해 보겠습니다.

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	scanf("%d", &n);
	//int* ptr = (int*)malloc(sizeof(int));
	int* ptr = calloc(n, sizeof(int));
	for (int i = 0; i < n; i++)
		ptr[i] = i + 1;

	ptr = realloc(ptr, sizeof(int)*n * 2);	// -------------- 이전보다 2배 크기로 재할당
	for (int i = n; i < n*2; i++)           // 새로 할당받은 공간에만 값 설정
		ptr[i] = i+1;

	for (int i = 0; i < n*2; i++)
		printf("%d ", ptr[i]);
	printf("\n");

    free(ptr);	// 동적 메모리 해방

	return 0;
}

(Output)

 

 

free

할당된 메모리 블록을 해제합니다.

void free(
   void *memblock
);

memblock: 이전에 할당된 메모리 블록

 

free 함수는 calloc, malloc, realloc으로 할당된 메모리 블록의 할당을 해제합니다.

 

 

 

 

반응형