[C] malloc과 free 함수
C언어에서 동적 메모리를 할당하기.
malloc 함수
# 파이썬 코드
num = int(input())
a_list[num]
파이썬에서는 위와 같은 형식으로 입력받은 값에 따라서 리스트의 길이를 정해줄 수 있었다.
하지만 C는 메모리, 즉 배열의 길이를 먼저 할당해주어야 하기 때문에
int main() {
int num;
printf("학생 수 입력 : ");
scanf("%d", &num);
int score[num];
for (int i = 0; i < num; i++) {
printf("%d번째 점수 입력 : ", i + 1);
scanf("%d ", &score[i]);
total += score[i];
}
printf("%d명의 점수 평균은 %.2f입니다.", num, (double)total / num);
return 0;
}
유감스럽게도 위와 같은 코드는 동작하지 않는다.
이 때, 동적 메모리 할당을 통해 위에 파이썬코드처럼 입력받은 값에 따라서
배열의 길이를 정해줄 수 있게 만든 함수가 malloc함수이다.
malloc 함수의 사용 예시
#include <stdio.h>
#include <stdlib.h> // malloc 함수를 사용하기 위한 장치
#pragma warning (disable : 4996)
int main() {
int num, total = 0;
int* score;
printf("학생 수 입력 : ");
scanf("%d", &num);
// int score[num]; 과 같은 효력을 가진다.
score = (int*)malloc(num * sizeof(int));
for (int i = 0; i < num; i++) {
printf("%d번째 점수 입력 : ", i + 1);
scanf("%d ", &score[i]);
total += score[i];
}
printf("%d명의 점수 평균은 %.2f입니다.", num, (double)total / num);
free(score);
// 동적으로 할당된 메모리를 해제한다. (포인터가 가리키는 메모리를 해제)
// malloc과 free는 반드시 함께여야한다.
return 0;
}
score = (int*)malloc(num * sizeof(int));
이 코드가 위에 리스트를 선언한 코드와 같은 효력을 가진다.
단, 메모리를 얼만큼 할당하느냐를 결정하는 함수이기 때문에 배열에 정수를 저장하고 싶으면
배열의 크기 * 자료형의 크기를 곱해주는 것이 좋다.
그리고 malloc함수는 포인터 변수를 반환하므로 위의 int* score와 같이 포인터 변수를 선언해두자.
여기서 맨 밑에 보면 free함수를 볼 수 있다.
구조체에서의 활용
#include <stdio.h>
#include <stdlib.h> // malloc 함수를 사용하기 위한 장치
#pragma warning (disable : 4996)
typedef struct student {
int kor, eng, mat;
double avr;
char name[20];
}student;
int main() {
int in;
student* st;
printf("학생 수 입력 : ");
scanf("%d", &in);
/*
student st[in]; // error가 난다. 이를 어떻게 고칠까?
*/
st = (student*)malloc(in * sizeof(student));
// 입력과 출력
for (int i = 0; i < in; i++){
printf("이름 입력 : ");
scanf("%s", st[i].name);
printf("점수 입력 (국어 영어 수학): ");
scanf("%d %d %d", &st[i].kor, &st[i].eng, &st[i].mat);
st[i].avr = (double)(st[i].kor + st[i].eng + st[i].mat) / 3;
printf("이름 : %s, 평균 : %.2f점\n", st[i].name, st[i].avr);
}
free(st);
return 0;
}
위와 같이 응용이 가능하다.
구조체가 자료형이므로 자료형 포인터 변수 자리에다가 자신이 선언한 구조체를 넣어주면 된다.
위의 코드는 학생의 수를 입력받은 뒤, 각각 학생의 이름, 점수를 입력받고 평균을 출력하는 코드이다.
free() 함수
메모리를 할당해주었으면 해제를 하는 작업도 해주어야 한다.
그렇지 않으면 컴퓨터를 재부팅 할 때 까지 할당된 메모리는 계속 할당된 채로 유지된다.
필요없는 메모리 할당을 메모리 누수라고 부른다.
이를 방지하기 위해서 사용이 끝났으면 메모리 할당을 해제하는 함수가 free 함수이다.
위에 보이듯이, 사용 예시는 아래와 같다.
free("malloc을 통해서 선언된 포인터 변수");
즉, free(score)를 해주면 malloc을 통해서 할당되었던 메모리가 다시 해제된다.
메모리 누수가 누적될경우 우리가 흔히 접했던 블루스크린을 접할 수 있으니
좋은 프로그램을 만들기 위해서는 이를 알아두자.
다른 언어에서는?
기능이 대부분 내장함수로 구현된 파이썬이나 자바에서는 malloc과 free를 사용할 필요가 없다.
언어 자체에 메모리를 할당하고 해제하는 기능이 구현되어있다.
대신에 파이썬과 자바는 구동속도가 C에 비해서는 느리다.
반면 C는 사용자가 malloc과 free와 같은 기본적인 함수를 사용해야하는 대신, 구동속도가 빠르다.