본문 바로가기
컴퓨터 공학/C, C++

[ C ] 메모리 이해하기7 _malloc 짝꿍 함수 free 란?

by hahehohoo 2020. 7. 16.
반응형

메모리 관련 함수 malloc, free, C언어 예제

 

 

메모리 관련 함수에는 다음과 같은 것들이 있습니다. 

이 글에서는 간단한 예제와 함께 malloc과 free함수에 대해 알아보겠습니다. 

메모리 할당 및 해제 함수
: 동적에서만 사용할 수 있음
기타 메모리 관련 함수
: 동적이든 정적이든 다 쓰일 수 있음(포인터만 사용하면 되는거라)
할당
malloc() // memory + allocate 메모리 할당하다
calloc()

해제
free() // free 자유롭게하다

재할당
realloc() // re + allocate 다시 할당하다

<stdlib.h>
memset()
memcpy()
memcmp()

<string.h>

 


■ malloc()

 

void* malloc(size_t size);

 

동적으로 메모리를 할당하는 함수(힙 영역에 메모리를 전달)

size 바이트 만큼의 메모리를 반환합니다. 

반환형은 범용적으로 프로그래머가 알아서 사용할 거라서 void* 입니다. 

함수 호출시 메모리가 없거나 할당에 실패하면 NULL이 반환합니다

포인터 외에 다른 자료형으로 반환될 수가 없습니다. 

 

반환된 메모리에 들어있는 값은 쓰레기값입니다. 즉, 초기화를 안 해줍니다.

malloc() 함수를 사용하고 초기화하는 방법을 알아보려면 아래 글을 읽어주세요. 

malloc() 사용 후 초기화하기 

 

 

int형 데이터를 저장하기 위해 리턴되는 void*을 int*로 변환해야 합니다. 

아래 그림은 포인터 변수 i에 4바이트를 할당하는 그림입니다. 

출처: https://dsnight.tistory.com/51

1. sizeof(int)의 값은 4입니다. 4라는 값을 전달하면서 malloc 함수를 호출합니다.

2. 할당된 메모리의 주소가 void*형으로 리턴됩니다. 리턴되는 void*를 사용하려는 int*형으로 변환합니다.

3. 포인터 변수 i에 대입합니다.

 

 

 

 

 free()

void free(void* ptr)

 

할당받은 메모리를 해제하는 함수

즉, 메모리 할당 함수들을 통해서 얻은 메모리만 해제 가능합니다.

그 외의 주소를 매개변수로 전달할 경우 결과가 정의되지 않습니다.

 

※※※ malloc() 할당받은 메모리는 내가 구속한 메모리라고 보면 됩니다.

※※※ 사용한 후 그 메모리는 꼭  free()로 풀어줘야 합니다.

※※※ 아니면 메모리 누수 발생합니다.

 

간단한 예제

#include <stdio.h>

#define LENGTH(10) // 데이터 10개를 받겠구나

size_t i;
int* nums = malloc(LENGTH * sizeof(int)); //int를 담는 메모리 공간 즉 힙에 만드는 동적 배열, 배열의 크기는 (요소 수) * (데이터의 크기), 약 40바이트 할당해달라

for(i=0; i < LENGTH; i++) {
    nums[i] = i * LENGTH;
}

for(i=0; i < LENGTH; i++) {
    printf("%d ", nums[i]);
}

free(nums); //꼭꼭꼭 해주기

 

 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

반응형


댓글