Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 35. 메모리 사용하기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 35. 메모리 사용하기

개발새발 문타쿠 2023. 9. 9. 23:08

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이면 메모리를 할당하는 패턴을 주로 사용