코드 영역
데이터 영역
힙 영역
스택 영역
malloc()
함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있도록 해준다.
#include <stdlib.h>
void *malloc(size_t size);
malloc()
함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다.
이 함수는 전달받은 메모리 크기에 맞고 아직 할당되지 않은 적당한 블록을 찾는다.
이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다.
만약 힙 영역에 할당할 수 있는 크기의 적당한 블록이 없다면 Null 포인터를 반환한다.
주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터 형식의 변수를 사용해야 한다.
이와 같이 동적 메모리 할당을 해야 하는 이유는 필요할 때 필요한 만큼만 메모리를 요청해서 사용하고 메모리를 절약하기 위해서이다.
calloc()
함수는 malloc()
함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수이다. malloc()
함수와 다른 점은 할당하고자 하는 메모리의 크기를 두 개의 인수로 나누어 전달받는다는 것이다.
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
calloc()
함수의 첫 번째 인수는 메모리 블록의 개수를 나타내며, 두 번째 인수는 각 블록 당 할당될 바이트 수를 나타낸다.
C에서는 free()
함수를 통해 힙 영역에 할당받은 메모리 공간을 다시 운영체제에게 반환해주어야 한다. 메모리 관리가 자동으로 이루어지지 않기 때문에 해당 함수를 사용하는 것이다.
free()
함수를 사용하여 다 사용한 메모리를 해제해주지 않으면, 메모리가 부족해지는 현상이 발생한다. 이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(Memory Leak)라고 한다.
#include <stdlib.h>
void free(void *ptr);
free()
함수의 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달하면 된다.
공유 메모리란 프로세스 사이에 메모리 영역을 공유해서 사용할 수 있도록 하는 메모리를 말한다.
#include <sys/shm.h>
#include <sys/ipc.h>
int shmget(key_t key, size_t size, int shmflg);
key_t_key
: 공유 메모리를 구별하는 key값
int size
: 공유 메모리 크기
int shmflg
: 여러가지 옵션을 추가
#include <sys/shm.h>
#include <sys/ipc.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmid
: shmget()
함수에 의해 반환된 int형의 식별자
const void *shmaddr
: 일반적으로 Null 지정. 커널에 매핑되지 않은 곳을 자동으로 찾아서 붙여준다.
int shmflg
: 여러가지 옵션을 추가
프로세스에서 공유 메모리를 분리한다.
#include <sys/shm.h>
#include <sys/ipc.h>
int shmdt(const void *shmaddr);
const void *shmaddr
: 분리할 공유 메모리 주소
공유 메모리를 int형 타입의 cmd 명령어에 따라 제어한다.
#include <sys/shm.h>
#include <sys/ipc.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int shmid
: 공유 메모리를 구별하는 식별자
int cmd
: 여러가지 제어명령
메모리 영역을 초기화하는 함수이다.
#include <string.h>
void *memset(void *s, int c, size_t n)
s
: 메모리 영역에 대한 포인터
c
: 초기화 값
n
: 초기화되기 원하는 크기
memset, memcpy, memmove, memchr, memcmp