malloc? [프로그래머가 메모리 할당과 해제를 할수있는 함수]
01. malloc으로 메모리할당
먼저 malloc을 사용하기 위해서는 #include<malloc.h> 해야한다.
#include <malloc.h>
int main(){
malloc(바이트 크기);
reutrn 0;
}
메모리 할당을 하기 위해서는 원하는 바이트 크기를 괄호안에 적어주면
메모리영역중 힙 이라는 영역에 크기만큼 할당 되게 된다.
malloc(1); 주소에 있는 값을 출력해보면
#include <malloc.h>
#include <stdio.h>
int main()
{
printf("값: %d", *((int*)(malloc(1))));
}
▲아직 값을 초기화 하지 않아 엉뚱한 값이 출력되는 것을 볼수있다.
-Tip-
(int*)mallloc(1) - int형 주소로 변환후
*((int*)mallloc(1))) - *을 붙이면 해당 주소의 값을 확인할 수 있다.
malloc함수는 힙영역에 입력한 크기만큼 공간은 할당되지만
자료형과 이름이 없고 주소만 반환하기 때문에
해당 주소를 포인터로 담아야한다.
#include <malloc.h>
#include <stdio.h>
int main()
{
int* p = (int*)malloc(4);
*p = 12;
printf("값: %d", *p);
}
▲포인터를 이용해 주소를 저장하고 직접적으로 값을 다룰수있다.
하지만 주의할것
#include <malloc.h>
#include <stdio.h>
int main()
{
int* p = (int*)malloc(1);
*p = 12;
printf("*p 의 값: %d\n", *p);
}
위 코드를 보면 문제점이 있다.
malloc을 통해 1바이트만 할당했는데 int(4바이트) 크기의 값을 받아와서 출력하는 것을 볼수있다.
단순히 값을 읽을수만 있는것이 아니라, 할당받지 않은 메모리도 값ㄴ을 마음대로 변경할수있다.
그래서 할당할때 주의해서 크기를 정해야한다.
아래 처럼 sizeof를 사용하면 실수를 줄일수있고
코드 작성하면서 크기가 커질수있는 struct(구조체) 크기로 할당할때도 일일이 값을 바꿀 필요가 없다.
02. free();
free는 말 그대로 자유롭게 놓아준다는 뜻으로
해당주소에있는 값들이 다시 할당 되지 않은 구역이된다.
힙영역에 할당된 메모리는 직접 할당해제를 하지 않으면
프로그램이 종료될때 까지 계속 쌓이기 때문에
사용이 끝나면 free(포인터 이름); 으로 해제 해줘야 한다.
두 경우를 보면 while문에 의해 계속해서 4바이트 메모리를 할당 하는데
이때 메모리 해제를 하지않게 되면
계속해서 메모리에 데이터가 쌓여가는것을볼수있다.
반드시 할당을 했으면 free()를 해주어야한다.
02. 동적할당 배열
int형 4개가 들어갈수 있는 16바이트를 할당해서
배열처럼 사용할수도있다.