C

6. malloc

Honyack 2023. 9. 1. 19:11

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();

힙영역에 할당된 메모리는 직접 할당해제를 하지 않으면

프로그램이 종료될때 까지 계속 쌓이기 때문에 

사용이 끝나면 free(포인터 이름); 으로 해제 해줘야 한다.

 

정상적으로 할당해제
해제하지 않았을때

 

두 경우를 보면 while문에 의해 계속해서 4바이트 메모리를 할당 하는데

이때 메모리 해제를 하지않게 되면

계속해서 메모리에 데이터가 쌓여가는것을볼수있다.

반드시 할당을 했으면 free()를 해주어야한다.

 

 

 


 

02. 동적할당 배열

int형 4개가 들어갈수 있는 16바이트를 할당해서

배열처럼 사용할수도있다.

 

학생 구조체 10개 생성
결과 출력

 

'C' 카테고리의 다른 글

블랙잭2  (0) 2023.09.05
플레이어 입장 프로그램  (0) 2023.09.04
5.다중포인터  (0) 2023.09.01
4. 구조체  (0) 2023.08.31
3.배열  (0) 2023.08.31