본문 바로가기
Language_/C 언어

[c언어] 메모리 동적할당 #malloc, calloc, realloc

by 낭람_ 2018. 8. 19.
반응형

[메모리 동적할당]


동적할당 : 프로그램 실행 중 필요한 만큼의 메모리를 할당하는 방식


정적할당 : 프로그램 실행 전 메모리를 할당하는 방식


동적할당을 사용하는 이유

- 만약 char name[15] 를 선언하고, 메모리를 12만큼 썻다면 3이라는 크기의 메모리가 낭비되기 때문이다. 또한, 메모리를 19만큼을 사용하고 싶다면 메모리가 초과되므로 name의 크기를 변경해줘야 하는 불편함이 있기 때문에 동적할당을 사용하고 오버플로우의 위험도 있기 때문에 동적할당을 사용한다.


동적할당의 세가지 방법

- void *malloc(size_t size) _ size바이트 만큼의 메모리를 힙에서 할당하여 반환

- void *calloc(size_t num, size_t size) _ (num*size)바이트 만큼의 메모리를 힙에서 할당하여 반환

- void *realloc(void* ptr, size_t size) _ ptr이 가리키는 메모리를 size바이트만큼 힙에서 재할당하여 반환


동적할당 함수들의 헤더

- stdlib.h 헤더파일을 써줘야한다.

- # include<stdlib.h>


malloc vs calloc

- malloc은 동적할당만 하지만 calloc은 동적할당을 하고 0으로 초기화를 해준다.

- malloc+memset(void* ptr, 0, size_t size)을 해주면 calloc과 똑같이 된다.

[memset함수에 대한 글]


동적할당한 메모리를 풀어주는 방법

- void free(void* ptr) _ ptr이 가리키는 메모리를 해제 (즉, 메모리가 필요없어지면 free함수를 통해 해제해야한다.)


malloc함수 예시

- width는 일반 int형 


int *arr = malloc(sizeof(int) * width);


calloc함수 예시

- width는 일반 int형 


int *arr = calloc(width, sizeof(int));


realloc함수 예시

- new_width는 새로운 크기, 일반 int형


realloc(arr, sizeof(int)*new_width);


free함수 예시


free(arr);


2차원 배열 동적할당

- 세로부분부터 동적할당하고 가로부분을 동적할당해주면 된다.


int height = 6, width = 8;

int **arr;

arr = (int**) malloc ( sizeof(int*) * height );

for(int i = 0; i < height; i++){
arr[i] = (int*) malloc ( sizeof(int) * width );
}


2차원 배열 동적할당 해제

- 동적할당과 반대로 가로부분 메모리를 해제하고 세로부분 메모리를 해제해주면 된다.


for(int i = 0; i < height; i++){
free(arr[i]);
}
free(arr);





반응형

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

[c언어] Visual Studio 콘솔창 유지  (0) 2018.10.06
[c언어] Visual Studio 2017 설치하기  (0) 2018.10.05
[c언어] c언어란?  (0) 2018.10.05
[c언어] scanf 오류 해결 방법  (4) 2018.10.02
[c언어] 포인터의 크기  (0) 2018.08.13

댓글