메모리 관련 함수 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() 함수를 사용하고 초기화하는 방법을 알아보려면 아래 글을 읽어주세요.
int형 데이터를 저장하기 위해 리턴되는 void*을 int*로 변환해야 합니다.
아래 그림은 포인터 변수 i에 4바이트를 할당하는 그림입니다.
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, C++' 카테고리의 다른 글
[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은? (398) | 2020.07.16 |
---|---|
[ C ] 메모리 이해하기8 _calloc(), memset(), realloc() (411) | 2020.07.16 |
[ C ] 메모리 이해하기6 _동적메모리란? / 동적 할당 개념 그림으로 이해하기 (395) | 2020.07.15 |
[ C ] 메모리 이해하기5_힙(heap) 메모리란? (395) | 2020.07.15 |
[ C ] 메모리 이해하기4 _스택(stack) 메모리란? (392) | 2020.07.15 |
댓글