study/C언어

동적 할당 정리(malloc, realloc, calloc, free 함수)

IT공부 2020. 6. 29. 16:55
반응형

동적 할당이란?

  • 프로그램 실행 중 필요한 메모리 공간을 할당
  • 중요한 것은 동적으로 메모리를 할당할 대 Heap(힙) 영역에 할당을 하는 것입니다. 
    • 성공 : 할당한 메모리의 첫 번째 주소 리턴 
    • 실패 : NULL 리턴

 

헤더 파일 - <stdlib.h>

메모리 할당 함수 - malloc

메모리 할당 및 초기화 - calloc

메모리 추가 할당 - realloc

메모리 해제 함수 - free


2) 함수 원형 

 

void *malloc(size_t size);

할당받을 메모리 크기를 인자로 받음 

 

ex) int * arr = (int *) malloc(sizeof(int) * n ); 

* 인자의 개수가 n개의 배열을 동적 할당한다. 

 

void *calloc(size_t nelem, sizeo_t elsize);

첫 번째 인자 배열 요소 갯수, 두번째 인자 각 배열요소 사이즈 

할당된 메모리 0으로 초기화 

 

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

이미 할당받은 메모리에 추가로 메모리 할당, 이전 메모리 주소는 사라짐

 

void free(void * ptr);

할당된 메모리를 해제한다. 

할당한 메모리를 제대로 해제해주지 않으면, 메모리 누수가 발생할 수 있음

free(arr); //malloc으로 메모리를 할당한 메모리를 해제한다. 


동적 할당 예제 1

 

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

int main(void)
{
	int i,arr[4] = { 4, 3, 2, 1};
	int* pArr;
	
	pArr = (int *)malloc(sizeof(int) * 4); //int type에 * 4 만큼의 메모리를 할당 
	
	if(pArr == NULL)
	{
		printf("동적 할당 실패!!"); 
	}
	
	for(i = 0; i < 4; i++)
	{
		pArr[i] = arr[i];
	 } 
	 
	for(i = 0; i < 4; i++)
	{
		printf("%d \n", pArr[i]);
	}
	
	free(pArr);
	
	return 0;
}

 

  • int* pArr = (int *)malloc(sizeof(int) * 4);

    (int *) : malloc의 반환형이 void* 이므로 int * 형변환 
    sizeof(int) * 4 : arr[4] 사이즈가 가지고 있는 동일한 크기의 메모리를 할당하기 위해서 int 타입 * 4를 해준 것

동적 할당 예제 2

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

int main(void)
{
	int i, num;
	printf("저장할 정수에 갯수를 입력하세요 : ");
	scanf("%d", &num);
	
	if(num == 0)
	{
		printf("zero를 입력하셨습니다. ");
		return 0;
	}
	
	//입력 받을 정수 만큼 메모리 동적 할당  
	int* pArr = (int *)malloc(sizeof(int)* num);
	
	//동적 할당 실패/성공 판단 
	if(pArr == NULL)
	{
		printf("동적 할당 실패!!");
		exit(1); 
	 } 
	
	//정수 입력 
	for(i = 0; i < num; i++)
	{
		printf("%d번째 입력 : ", i+1);
		scanf("%d", &pArr[i]);
		
	}
	printf("\n");
	
	//정수 출력 
	for(i = 0; i < num; i++)
	{
		printf("%d번째 정수 : %d\n", i + 1, pArr[i]);
	} 
		
	//동적 할당 해제 
	free(pArr); 
	
	return 0; 
}

'study > C언어' 카테고리의 다른 글

포인터 배열과 배열 포인터에 대한 이해  (0) 2020.06.29
define 매크로와 inline 함수  (0) 2020.06.29
WIN API [GetVolumeInformation() 함수]  (0) 2020.04.08
구조체 정리  (0) 2020.04.02
[c언어] 입출력 정리  (0) 2020.04.02