메모리는 malloc -> 사용 -> free패턴으로 사용함.
메모리를 사용하려면 malloc함수를 사용해 메모리 공간을 확보해야한다.
메모리 크기는 바이트 단위임.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int num1 = 20; // int형 변수 선언
int *numPtr1; // int형 포인터 선언
numPtr1 = &num1; // num1의 메모리 주소를 구하여 numPtr에 할당
int *numPtr2; // int형 포인터 선언
numPtr2 = malloc(sizeof(int)); // int의 크기 4바이트만큼 동적 메모리 할당
printf("%p\n", numPtr1); // 006BFA60: 변수 num1의 메모리 주소 출력
// 컴퓨터마다, 실행할 때마다 달라짐
printf("%p\n", numPtr2); // 009659F0: 새로 할당된 메모리의 주소 출력
// 컴퓨터마다, 실행할 때마다 달라짐
free(numPtr2); // 동적으로 할당한 메모리 해제
return 0;
}
numPtr1을 출력하면 일반 변수의 메모리 주소가 출력됐고,
numPtr2를 출력하면 int 크기인 4바이트만큼 동적 메모리가 할당된 주소가 나옴.
두 개의 메모리 주소가 차이가 나는 이유?
변수는 스택에 저장되는데 malloc함수는 힙 부분의 메모리를 사용함.
(스택, 힙의 위치랑 자라는 방향은 운영체제와 플랫폼에 따라 다름)
스택과 힙의 큰 차이점?
힙은 메모리 해제를 꼭 해줘야함.
free(numPtr2); // 동적으로 할당한 메모리 해제
이런식으로 해줌. 필수* 안해주면 메모리 부족해짐.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int *numPtr; // int형 포인터 선언
numPtr = malloc(sizeof(int)); // int의 크기 4바이트만큼 동적 메모리 할당
*numPtr = 10; // 포인터를 역참조한 뒤 값 할당
printf("%d\n", *numPtr); // 10: 포인터를 역참조하여 메모리에 저장된 값 출력
free(numPtr); // 동적 메모리 해제
return 0;
}
malloc함수로 할당한 메모리에 값을 저장할때는 포인터를 역참조해서 저장하면 됨.
memset(포인터, 설정할 값, 크기)
memset함수는 메모리의 내용을 원하는 크기만큼 특정값으로 설정함.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
#include <string.h> // memset 함수가 선언된 헤더 파일
int main()
{
long long *numPtr = malloc(sizeof(long long)); // long long의 크기 8바이트만큼 동적 메모리 할당
memset(numPtr, 0x27, 8); // numPtr이 가리키는 메모리를 8바이트만큼 0x27로 설정
printf("0x%llx\n", *numPtr); // 0x2727272727272727: 27이 8개 들어가 있음
free(numPtr); // 동적으로 할당한 메모리 해제
return 0;
}
0x27이 8개 들어감.
memset함수는 주로 설정할 값을 0으로 지정해서 메모리 내용을 모두 0으로 만들때 사용한다.
널(NULL)포인터?
아무것도 가리키지 않는 상태인 포인터. 역참조 불가능.
주로 언제 사용?
if (ptr == NULL) // ptr이 널 포인터라면
{
ptr = malloc(1024); // 1024바이트만큼 메모리 할당
}
포인터가 NULL인지 확인하고 NULL이면 메모리를 할당하기 위해 주로 사용함.
'System Hacking > Basics' 카테고리의 다른 글
docker 정리 (1) | 2025.04.28 |
---|---|
Heap힙 /ptmalloc (0) | 2025.04.28 |
C언어 포인터 복습 (0) | 2025.04.27 |
docker 명령어 (1) | 2025.04.27 |
컴파일(Compile), 링커(Linker) 정리함 (0) | 2025.04.24 |