System Hacking/Basics

malloc / 메모리사용

hanbunny 2025. 4. 27. 22:59

메모리는 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