malloc()
계열의 라이브러리 함수를 사용하여 할당받아 사용할 수 있습니다.#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *pi; // pointer integer
pi = (int *)malloc(sizeof(int));
// malloc = 메모리를 할당해라. (4만큼)
if (pi==NULL){
printf("동적 메모리 할당에 실패했습니다.\n");
exit(1);
}
*pi = 100;
printf("%d\n",*pi);
//동적 메모리 사용한 이후에는 무조건 해당메모리 반환
free(pi);
return 0;
//실행결과
// 100
}
malloc
= memory allocation
이 함수는 인자로 전달된 크기의 바이트 수만큼 메모리 공간을 만듭니다. 이 함수가 리턴하는 것은 자신이 할당한 메모리의 시작 주소를 리턴하게 됩니다. 이 때, 리턴형이 (void*) 형이므로 우리는 이를 (int*) 형으로 형변환 하여 pi에 넣어주기만 하면된다.
그리고 마지막에 free
는 우리가 할당받은 메모리를 다 쓰고 난 후에 메모리 영역을 다시 컴퓨터에게 돌려주는 역할을 합니다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *pc = NULL;
int i = 0;
//100개의 문자를 저장하기 위한 공간 생성
pc = (char *)malloc(100 * sizeof(char));
if (pc == NULL){
printf("동적메모리할당 실패\n");
exit(1);
}
//pc가 가르키는 포인터를 1씩 증가시키며 알파벳
//소문자 삽입
for (i = 0; i < 26; i++)
{
*(pc + i) = 'a' + i;
}
// 아스키 코드 0은 NULL을 의미합니다.
// 문자배열 마지막에 0을 넣어서 마무리
*(pc + i) = 0;
printf("%s\n",pc);
free(pc);//메모리해제
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *pi, i;
pi = (int *)malloc(5 * sizeof(int));
if (pi == NULL){
printf("실패\n");
exit(1);
}
pi[0] = 100;
pi[1] = 200;
pi[2] = 300;
pi[3] = 400;
pi[4] = 500;
for (i = 0; i < 5; i++)
{
printf("%d\n", *(pi+i));
}
free(pi); //메모리해제
return 0;
}
메모리 해제는 선택이 아닌 필수다. 실무에서는 메모리를 자주, 많이 할당하기 때문에 메모리를 할당만 하고 해제를 해주지 않으면 결국에는 시스템의메모리가 부족해지므로 운영체제가 프로그램을 강제로 종료시키거나 메모리 할당에 실패하게 됩니다. 특히 메모리를 해제 하지 않아 사용량이 계속 증가하는 현상을 메모리 누수(memory leak)
라 부릅니다.
/* 2 차원 배열의 동적 할당 */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int i;
int x, y;
int **arr; // 우리는 arr[x][y] 를 만들 것이다.
printf("arr[x][y] 를 만들 것입니다.\n");
scanf("%d %d", &x, &y);
arr = (int **)malloc(sizeof(int *) * x);
// int* 형의 원소를 x 개 가지는 1 차원 배열 생성
for (i = 0; i < x; i++) {
arr[i] = (int *)malloc(sizeof(int) * y);
}
printf("생성 완료! \n");
for (i = 0; i < x; i++) {
free(arr[i]);
}
free(arr);
return 0;
}