문타쿠, 공부하다.
[C언어 코딩 도장] Unit 35. 메모리 사용하기 본문
INTRO
포인터에 원하는 만큼 메모리 공간을 할당받아 사용하는 방법을 알아보자.
메모리는 malloc -> 사용 -> free 패턴으로 사용한다.
35.1 메모리 할당하기
메모리를 사용하려면 malloc(memory allocation) 함수로 사용할 메모리 공간을 확보해야 한다.
-> 필요한 메모리 크기는 바이트 단위로 지정
-> stdlib.h 헤더 파일 선언
-> 원하는 시점에 원하는 만큼 메모리를 할당할 수 있다고 하여 동적 메모리 할당이라 부른다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num1 = 20;
int* numPtr1;
int* numPtr2;
numPtr1 = &num1;
// int의 크기 4바이트만큼 동적 메모리 할당
numPtr2 = malloc(sizeof(int));
printf("%p\n", numPtr1);
printf("%p\n", numPtr2);
// 동적으로 할당한 메모리 해제
free(numPtr2);
return 0;
}
*변수는 스택에, malloc 함수는 힙 영역의 메모리를 사용한다.
*스택에 생성된 변수는 사용한 뒤 따로 처리를 해주지 않아도 되지만, malloc 함수를 사용하여 힙에서 할당한 메모리는 반드시 해제를 해주어야 한다. -> free()
*메모리 해제는 선택이 아닌 필수 -> 메모리를 해제하지 않아 메모리 사용량이 계속 증가하는 현상을 메모리 누수라 부른다.
35.2 메모리에 값 저장하기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* numPtr;
numPtr = malloc(sizeof(int));
*numPtr = 10;
printf("%d\n", *numPtr);
free(numPtr);
return 0;
}
35.3 메모리 내용을 한꺼번에 설정하기
memset(memory set) 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정 값으로 설정할 수 있다.
-> string.h 헤더 파일 선언
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
long long* numPtr = malloc(sizeof(long long));
// memset(포인터, 설정할 값, 크기);
// numPtr이 가리키는 메모리를 8바이트만큼 0x27로 설정
memset(numPtr, 0x27, 8);
printf("0x%llx\n", *numPtr);
free(numPtr);
return 0;
}
long long* numPtr = malloc(sizeof(long long));
memset(numPtr, 0, sizeof(long long));
- memset 함수는 주로 설정할 값을 0으로 지정히여 메모리의 내용을 모두 0으로 만들 때 주로 사용
- memset 함수에 설정할 크기를 지정할 때 보통 숫자 대신 sizeof를 사용한다.
35.4 널 포인터 사용하기
#include <stdio.h>
int main(void)
{
int* numPtr1 = NULL;
printf("%p\n", numPtr1);
return 0;
}
- NULL이 들어있는 포인터를 널 포인터라고 하며 아무것도 가리키지 않는 상태를 뜻함 -> 역참조 불가
if (ptr == NULL)
{
ptr = malloc(1024);
}
- 위와 같이 포인터가 NULL인지 확인한 뒤 NULL이면 메모리를 할당하는 패턴을 주로 사용
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 36. 배열 사용하기 (0) | 2023.09.10 |
---|---|
[C언어 코딩 도장] Unit 35. 연습문제 및 심사문제 (0) | 2023.09.10 |
[C언어 코딩 도장] Unit 34. 연습문제 및 심사문제 (0) | 2023.09.09 |
[C언어 코딩 도장] Unit 34. 포인터 사용하기 (0) | 2023.09.09 |
[C언어 코딩 도장] Unit 33. 연습문제 및 심사문제 (0) | 2023.09.05 |