c 메모리

떵떵·2022년 6월 16일
0

c에서는 포인터에 변수의 메모리 주소를 저장하는 방식만 봤고 이번에는 포인터에 원하는 만큼 메모리 공간을 할당받아 사용하는 방법을 알아본다.

포인터의 사용법:
1. 변수의 메모리 주소를 저장하여 사용
2. 포인터에 원하는 메모리 공간을 할당 받아 사용

2. 메모리 공간 할당

c에서는 메모리 공간을 할당하는 malloc()이라는 함수가 있다.

malloc() -> 사용 -> free패턴으로

malloc으로 공간을 할당받고 사용하고 free로 할당받은 공간을 반환한다.

malloc() 사용법

포인터 = malloc(sizeof(형식))

malloc은 포인터에 메모리 공간을 할당하는 함수로서 원하는 형식을 정하고 sizeof()로 형식의 크기를 malloc에 넣어주어 메모리를 할당한다.

원하는 시점에 원하는 만큼 메모리를 할당할 수 있다고 하여 '동적 메모리 할당'이라고도 한다.

변수와 malloc 할당의 차이점

포인터는 두가지 방법으로 메모리를 할당하는데

  1. 변수의 주소 (&num)
  2. malloc(sizeof(형식))

위 2가지이다.

방법이 다른만큼 두가지는 내부적으로 약간의 차이를 가지고있다.

변수의 주소로 할당하는 포인터는 스택(stack)에 생성되고 malloc함수는 힙(heep) 부분의 메모리를 사용한다.

!메모리 해제에서도 차이가 있다!

변수의 주소를 할당한 포인터는 스택(stack)에 생성되므로 따로 처리를 하지 않아도 되지만 malloc으로 할당한 메모리는 힙(heep)에 생성되었기 때문에 반드시 해제를 해주어야 한다.

free()로 메모리 해제를 하는 것은 필수이며 해제를 안해서 사용량이 증가하면 메모리 누수(memory leak)가 발생하여 프로그램이 꺼지거나 메모리 할당이 안 될 수 있다.

memset() 메모리세팅

메모리를 할당한 포인터에 값을 넣을 때 2가지 방법이 있다.

  1. *포인터 = 값;
  2. memset(포인터, 값, 크기);

1번쨰는 우리가 자주 하고 보던 것이라 생략

2번째는 memset()함수를 이용한 방법으로 원하느 값을 원하는 크기만큼 바이트 단위로 설정할 수 있다.

memset(pointer, value, size);

memset(numptr, 0x27, 8); 을 하면 numptr이라는 포인터의 주소에 16진수인 0x27을 8바이트만큼 넣어준다.
-> 0x2727272727272727

!중요!
memset을 이용하면서 size칸을 넣을ㄷ 때 예시처럼 숫자(8)를 넣는것이 아닌 sizeof()를 사용하여 형식의 크기만큼 넣어준다.

보통 포인터에 메모리를 할당할 때 malloc()에서 sizeof(형식)을 사용하여 넣기 때문에 memset()으로 값을 넣을 때도 sizeof(형식)으로 지정해주어야 한다.

memset함수는 주로 설정할 값을 0으로 지정하여 메모리의 내용을 모두 0으로 만들때 사용한다.

포인터에 NULL 할당

포인터에 메모리를 할당하지 않을 수도 있다.

"int *numptr = NULL;" 이 바로 그것이다.

int *numptr = NULL;
printf("%p", numptr);
>>> 000000

이처럼 포인터에 NULL을 할당하면 아무것도 할당하지 않은 상태로 주소도 없다.
물론 역참조로 값을 넣을수도 없다.
*numptr = 값 - 불가능!!

NULL이 들어있는 포인터를 널 포인터(null pointer)라고 한다.

보통 null로 포인터를 검증하는 패턴으로 사용한다.

if (numptr == NULL)
	numptr = malloc(sizeof(int))

0개의 댓글