๐Ÿ‘‰๐Ÿป C_dynamic memory management_CheatSheet_v1

A Yeon Jangยท2025๋…„ 8์›” 8์ผ
post-thumbnail

๐Ÿ†š Python vs C: ๋น„๊ต


๐Ÿ” ์˜ˆ์‹œ ๋น„๊ต

โœ… Python ์˜ˆ์ œ

def hello():
    arr = [0] * 100  # ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋จ
    print("Hello from Python!")

hello()
# ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ, arr์€ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๋ฉด GC๊ฐ€ ์ž๋™ ํ•ด์ œ

โœ… C ์˜ˆ์ œ

#include <stdio.h>
#include <stdlib.h>

void hello() {
    int *arr = malloc(sizeof(int) * 4); // ์ฒ˜์Œ๋ถ€ํ„ฐ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œ
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 30;
    arr[3] = 40;
    printf("%d %d %d %d\n", arr[0], arr[1], arr[2], arr[3]);
    free(arr); // ๋ฐ˜๋“œ์‹œ ์ˆ˜๋™ ํ•ด์ œ
}

int main() {
    hello();
    return 0;
}

1. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹

Python ์€ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์–ธ์–ด๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ Garbage Collector(GC) ๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค.
์ด GC๋Š” ์ฃผ๋กœ ์ฐธ์กฐ ์นด์šดํŒ…(reference counting) ๊ณผ ์ˆœํ™˜ ์ฐธ์กฐ ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ž‘๋™ํ•œ๋‹ค.

C ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ• ๋‹น(malloc)ํ•˜๊ณ  ํ•ด์ œ(free)ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak), ์ด์ค‘ ํ•ด์ œ(double free), ํ•ด์ œ ํ›„ ์ ‘๊ทผ(use after free) ๊ฐ™์€ ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ถœ์ฒ˜ : https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/

2. ๋ณ€์ˆ˜์˜ ์ €์žฅ ์œ„์น˜

Python ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด๋กœ ๋‹ค๋ค„์ง€๋ฉฐ, ์ด ๊ฐ์ฒด๋“ค์€ ๋ฌด์กฐ๊ฑด ํž™(Heap) ์— ์ €์žฅ๋œ๋‹ค.
ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ๋„ ์‹ค์ œ๋กœ๋Š” ํž™์— ์ €์žฅ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ(reference) ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค.

C ์—์„œ๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธํ•œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ์Šคํƒ(stack) ์— ์ €์žฅ๋˜๊ณ , ๋™์  ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ๋Š” ํž™(heap) ์— ์ €์žฅ๋œ๋‹ค.
C๋Š” ์ด์ฒ˜๋Ÿผ ์Šคํƒ๊ณผ ํž™์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, Python์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํž™์— ์˜ฌ๋ฆฐ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


3. ๋™์  ํ• ๋‹น ๋ฐ ํ•ด์ œ

Python ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ, ๊ฐ์ฒด ๋“ฑ ๋ชจ๋“  ๊ฒƒ์ด "์ž๋™์œผ๋กœ" ๋™์  ํ• ๋‹น๋˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๊ฐ€ ์–ธ์ œ ์ผ์–ด๋‚ ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธกํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

C ์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ malloc() ๋“ฑ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ free()๋กœ ๋ฐ˜๋‚ฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์†Œํ™€ํžˆ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ๊ธด ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์„œ๋ฒ„์—์„œ๋Š” ์น˜๋ช…์ ์ด๋‹ค.

๐Ÿ”ฅ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ !
๋‘ ์–ธ์–ด ๋ชจ๋‘ ํž™ ์˜์—ญ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žก๋Š” ๋™์ ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‚˜

  • C์–ธ์–ด โ†’ ํฌ๊ธฐ ์ง€์ • ํ•„์ˆ˜, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌ (malloc, free)
  • Python โ†’ ํฌ๊ธฐ ์ง€์ • ๋ถˆํ•„์š”, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ž๋™ ๊ด€๋ฆฌ (GC ํฌํ•จ)

4. ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—ฌ๋ถ€

Python ์—์„œ๋Š” ํฌ์ธํ„ฐ๋ผ๋Š” ๊ฐœ๋…์ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” "ํฌ์ธํ„ฐ ๊ฐ™์€ ๊ฒƒ"์ด์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

C ์–ธ์–ด๋Š” ํฌ์ธํ„ฐ ๊ธฐ๋ฐ˜ ์–ธ์–ด๋‹ค. ๋ฐฐ์—ด, ํ•จ์ˆ˜ ์ „๋‹ฌ, ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ
์ง์ ‘ ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์‹ค์ˆ˜์— ๋งค์šฐ ์ทจ์•ฝํ•˜๋‹ค.


5. ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ

Python ์€ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์ค‘์‹œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ–ˆ์ง€๋งŒ,
๊ทธ๋งŒํผ ๋Ÿฐํƒ€์ž„์—์„œ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

C ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ•ด์•ผ ํ•˜์ง€๋งŒ, ๊ทธ๋งŒํผ ์ •๋ฐ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์„ฑ๋Šฅ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์— ์œ ๋ฆฌํ•˜๋‹ค.


6. ์ปดํŒŒ์ผ ๋ฐฉ์‹๊ณผ ์‹คํ–‰

Python ์€ C์ฒ˜๋Ÿผ ์ง์ ‘ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€
์ค‘๊ฐ„ ์–ธ์–ด์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„ ํ•ด์„ํ•˜๋ฉฐ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.

C ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ „์ฒด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ํ•œ๋ฒˆ์— ์ปดํŒŒ์ผํ•ด์„œ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.


๐Ÿ“Œ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (Dynamic Memory Allocation)

๐Ÿ’ฌ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด๋ž€?

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ํ•„์š”ํ•œ ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํž™(Heap) ์˜์—ญ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ  ์ค‘๊ฐ„์— ๋” ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ ํ• ๋‹น์„ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.


๐Ÿ†š ๋Œ€๋น„๋˜๋Š” ๊ฐœ๋…

โ˜‘๏ธ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (Static Memory Allocation)

  • ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.
  • ์ „์—ญ ๋ณ€์ˆ˜, static ํ‚ค์›Œ๋“œ ๋ณ€์ˆ˜ ๋“ฑ์ด ํ•ด๋‹น.
  • ์žฅ์ : ๋น ๋ฅธ ์ ‘๊ทผ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
  • ๋‹จ์ : ์œ ์—ฐ์„ฑ์ด ์—†์Œ (ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)
#include <stdio.h>

// ์ „์—ญ ๋ณ€์ˆ˜ (ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
int global_array[5]; 

int main() {
    static int static_array[5]; // ํ•จ์ˆ˜ ๋‚ด static ๋ณ€์ˆ˜
    for (int i = 0; i < 5; i++) {
        global_array[i] = i + 1;
        static_array[i] = (i + 1) * 10;
    }

    for (int i = 0; i < 5; i++) {
        printf("global[%d] = %d, static[%d] = %d\n", i, global_array[i], i, static_array[i]);
    }
    return 0;
}

โ˜‘๏ธ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (Automatic Memory Allocation)

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์Šคํƒ(Stack) ์˜์—ญ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น.
  • ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋จ.
  • ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์ด ํ•ด๋‹น.
  • ์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†์Œ
  • ๋‹จ์ : ํ•จ์ˆ˜ ์ข…๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ์†Œ๋ฉธ
#include <stdio.h>

void func() {
    int local_array[5]; // ์Šคํƒ์— ์ €์žฅ
    for (int i = 0; i < 5; i++) {
        local_array[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        printf("%d ", local_array[i]);
    }
    printf("\n");
}

int main() {
    func();
    // ์—ฌ๊ธฐ์„œ๋Š” local_array์— ์ ‘๊ทผ ๋ถˆ๊ฐ€ (์ด๋ฏธ ํ•ด์ œ๋จ)
    return 0;
}
๋ณ€์ˆ˜ ์ข…๋ฅ˜์˜ˆ์‹œ์ €์žฅ ์œ„์น˜์ƒ์„ฑ ์‹œ์ ์†Œ๋ฉธ ์‹œ์ ํŠน์ง•
์ž๋™ ๋ณ€์ˆ˜ (Automatic)int x = 0; (ํ•จ์ˆ˜ ๋‚ด๋ถ€)์Šคํƒ(Stack)ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œํ•จ์ˆ˜ ์ข…๋ฃŒ๊ธฐ๋ณธ ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ์ž๋™ ํ•ด์ œ
์ •์  ๋ณ€์ˆ˜ (Static)static int y = 0; (ํ•จ์ˆ˜ ๋‚ด๋ถ€)๋ฐ์ดํ„ฐ ์˜์—ญ(Data Segment)ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋๋‚˜๋„ ๊ฐ’ ์œ ์ง€
์ „์—ญ ๋ณ€์ˆ˜ (Global)int g = 0; (ํ•จ์ˆ˜ ์™ธ๋ถ€)๋ฐ์ดํ„ฐ ์˜์—ญ(Data Segment)ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
๋™์  ๋ณ€์ˆ˜ (Dynamic)malloc(sizeof(int) * 10);ํž™(Heap)malloc ํ˜ธ์ถœ ์‹œfree ํ˜ธ์ถœ ์‹œํฌ๊ธฐ ์‹คํ–‰ ์ค‘ ๊ฒฐ์ •, ์ˆ˜๋™ ํ•ด์ œ ํ•„์š”

๐Ÿ› ๏ธ ์ฃผ์š” ํ•จ์ˆ˜

โš™๏ธ malloc

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = malloc(sizeof(int) * 5); // int 5๊ฐœ ๊ณต๊ฐ„ ํ• ๋‹น
    if (arr == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ\n");
        return 1;
    }
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    free(arr); // ํ•ด์ œ
    return 0;
}

๐Ÿ’ก Point

  1. ์ดˆ๊ธฐํ™” ์•ˆ ํ•จ
    • ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์€ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’(์ด์ „ ๋ฉ”๋ชจ๋ฆฌ ์ž”์žฌ)์ด๋‹ค.
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ memset ๋“ฑ์œผ๋กœ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.
 int arr[5];
    memset(arr, 0, sizeof(arr)); // ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ 0์œผ๋กœ ์ฑ„์›€ 
  1. ์†๋„๊ฐ€ ๋น ๋ฆ„
    • ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆ ํ•˜๋ฏ€๋กœ calloc๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ๋น ๋ฅด๋‹ค.
  2. ํฌ๊ธฐ ์ง€์ • ํ•„์ˆ˜
    • sizeof(ํƒ€์ž…) * ๊ฐœ์ˆ˜ ํ˜•ํƒœ๋กœ ๋ฐ”์ดํŠธ ํฌ๊ธฐ๋ฅผ ์ง์ ‘ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.
  3. ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 
    • NULL ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ์„ฑ ์ฒดํฌ ํ•„์š”.
    • ์ดˆ๊ธฐํ™” ์•ˆ ํ•˜๋ฉด ์“ฐ๋ ˆ๊ธฐ ๊ฐ’ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

โš™๏ธ calloc

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = calloc(5, sizeof(int)); // int 5๊ฐœ ๊ณต๊ฐ„ ํ• ๋‹น + 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    if (arr == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ\n");
        return 1;
    }

    printf("calloc์œผ๋กœ ํ• ๋‹น๋œ ๋ฐฐ์—ด (0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ):\n");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // ์ „๋ถ€ 0 ์ถœ๋ ฅ
    }
    printf("\n");

    free(arr);
    return 0;
}

๐Ÿ’ก Point

  1. 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    • ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด๋ฅผ 0์œผ๋กœ ์ฑ„์šด๋‹ค(์ •์ˆ˜๋Š” 0, ํฌ์ธํ„ฐ๋Š” NULL).
  2. ์ธ์ž ๋‘ ๊ฐœ
    • calloc(๊ฐœ์ˆ˜, ํฌ๊ธฐ) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ. ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐ’์„ ๊ณฑํ•ด ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  3. ์•ˆ์ „์„ฑ
    • ์ดˆ๊ธฐํ™” ๋•๋ถ„์— ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด ๋””๋ฒ„๊น…์ด ํŽธํ•˜๋‹ค.
  4. ์†๋„๋Š” ๋‹ค์†Œ ๋А๋ฆผ
    • 0 ์ดˆ๊ธฐํ™” ๊ณผ์ • ๋•Œ๋ฌธ์— malloc๋ณด๋‹ค ์•ฝ๊ฐ„ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค(๋Œ€๋ถ€๋ถ„ ๋ฏธ๋ฏธํ•œ ์ฐจ์ด).

โš™๏ธ realloc

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = malloc(sizeof(int) * 3); // ์ฒ˜์Œ 3์นธ ํ• ๋‹น
    if (arr == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ\n");
        return 1;
    }

    for (int i = 0; i < 3; i++) {
        arr[i] = (i + 1) * 10;
    }

    printf("realloc ์ „:\n");
    for (int i = 0; i < 3; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // ํฌ๊ธฐ๋ฅผ 5์นธ์œผ๋กœ ํ™•์žฅ
    arr = realloc(arr, sizeof(int) * 5);
    if (arr == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น ์‹คํŒจ\n");
        return 1;
    }

    printf("realloc ํ›„ (๋Š˜์–ด๋‚œ ๋ถ€๋ถ„ ์ดˆ๊ธฐํ™” ์•ˆ ๋จ, ์“ฐ๋ ˆ๊ธฐ ๊ฐ’ ๊ฐ€๋Šฅ):\n");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr);
    return 0;
}

๐Ÿ’ก Point

  1. ํฌ๊ธฐ ๋ณ€๊ฒฝ
    • ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ธ๋‹ค.
  2. ๋ฐ์ดํ„ฐ ์œ ์ง€
    • ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•˜๋˜, ํ™•์žฅ๋œ ๋ถ€๋ถ„์€ ์ดˆ๊ธฐํ™” ์•ˆ ํ•œ๋‹ค(์“ฐ๋ ˆ๊ธฐ ๊ฐ’ ๊ฐ€๋Šฅ).
  3. ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ
    • ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๊ณ  ๊ธฐ์กด ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์–ด, ์›๋ž˜ ํฌ์ธํ„ฐ ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
  4. ๋™์  ํ™•์žฅ์— ์œ ๋ฆฌ
    • ์ ์ง„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋™์  ๋ฐฐ์—ด ๊ตฌํ˜„)์— ํšจ์œจ์ ์ด๋‹ค.
  5. ์ฃผ์˜์ 
    • realloc ์‹คํŒจ ์‹œ NULL์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ธฐ์กด ํฌ์ธํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ.
      ๊ทธ๋ž˜์„œ ๊ธฐ์กด ํฌ์ธํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ฎ์–ด์“ฐ์ง€ ๋ง๊ณ  ์ž„์‹œ ๋ณ€์ˆ˜(tmp)์— ๋ฐ›์•„์„œ ํ™•์ธ ํ›„ ๊ต์ฒดํ•˜๋Š” ์Šต๊ด€์ด ์•ˆ์ „ํ•˜๋‹ค.
int *arr = malloc(sizeof(int) * 5);

// ํฌ๊ธฐ ๋Š˜๋ฆฌ๊ธฐ
arr = realloc(arr, sizeof(int) * 10); // โš ๏ธ ์œ„ํ—˜
if (arr == NULL) {
    // ์—ฌ๊ธฐ ์˜ค๋ฉด arr์— NULL์ด ๋“ค์–ด๊ฐ โ†’ ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ์žƒ์–ด๋ฒ„๋ฆผ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ
}

โ˜‘๏ธ malloc, calloc, realloc, free

์ฃผ์š” ํ•จ์ˆ˜๋ช…๊ธฐ๋ŠฅํŠน์ง•
malloc(size)size ๋ฐ”์ดํŠธ ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ดˆ๊ธฐํ™” ์•ˆ ๋˜์–ด ์žˆ์Œ (์“ฐ๋ ˆ๊ธฐ ๊ฐ’)
calloc(n, size)n๊ฐœ ร— size ๋ฐ”์ดํŠธ ํ• ๋‹น0์œผ๋กœ ์ดˆ๊ธฐํ™”
realloc(ptr, size)๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ๋ณ€๊ฒฝ๋ฐ์ดํ„ฐ ์œ ์ง€ํ•˜๋ฉด์„œ ํฌ๊ธฐ ์กฐ์ ˆ
free(ptr)ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•„์ˆ˜ ํ˜ธ์ถœ, ์•ˆ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

  1. free ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ
    • ๋™์  ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak) ๋ฐœ์ƒ.
  2. ํ• ๋‹น ์‹คํŒจ ์ฒดํฌ
    • ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์‹œ NULL ๋ฐ˜ํ™˜ โ†’ ๋ฐ˜๋“œ์‹œ ํ™•์ธ.
  3. ํ•ด์ œ ํ›„ ํฌ์ธํ„ฐ ์ดˆ๊ธฐํ™”
    free(arr);
    arr = NULL;
    ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ”๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ดํ›„ ๋™์ž‘์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์ž˜๋ชป๋œ ์‚ฌ์šฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๊ณผ์ • ํ•„์ˆ˜
    ์ฆ‰, free(arr)๋Š” ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ–ˆ์„ ๋ฟ ํ•ด๋‹น ํฌ์ธํ„ฐ๋Š” ์•„์ง ๊ทธ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค
  4. ํ•ด์ œํ•˜์ง€ ์•Š์€ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๊ธˆ์ง€
    • ํ•ด์ œ ํ›„ ์ ‘๊ทผ ์‹œ use-after-free ์˜ค๋ฅ˜ ๋ฐœ์ƒ.

๐Ÿ› ๏ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ฃผ์š” ํ•จ์ˆ˜ ์ •๋ฆฌ

1๏ธโƒฃ memset

void *memset(void *ptr, int value, size_t num);
  • ๊ธฐ๋Šฅ: ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ value๋กœ ์ฑ„์›€.
  • ์‚ฌ์šฉ ์˜ˆ: ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”, ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™”
  • ํŠน์ง•:
    1. value๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ•ด์„๋จ (์˜ˆ: memset(arr, 1, 4) โ†’ ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ 0x01๋กœ ์ฑ„์›€)
    2. ๊ตฌ์กฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
    3. ์ •์ˆ˜ 0 ์ด์™ธ์˜ ๊ฐ’ ์ฑ„์šธ ๋•Œ ์ฃผ์˜ (4๋ฐ”์ดํŠธ int ์ „๋ถ€ ๊ฐ™์€ ๋ฐ”์ดํŠธ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง)

2๏ธโƒฃ memcpy

void *memcpy(void *dest, const void *src, size_t num);
  • ๊ธฐ๋Šฅ: src์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ์„ dest๋กœ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ.
  • ์‚ฌ์šฉ ์˜ˆ: ๋ฐฐ์—ด/๊ตฌ์กฐ์ฒด ๋ณต์‚ฌ, ๋ฒ„ํผ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
  • ํŠน์ง•:
    1. ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ๋งŒ ์•ˆ์ „ (overlap ๋ฐœ์ƒ ์‹œ ๋™์ž‘ ์˜ˆ์ธก ๋ถˆ๊ฐ€)
    2. ์†๋„๊ฐ€ ๋น ๋ฆ„ (๊ฒน์นจ ๊ณ ๋ ค ์•ˆ ํ•จ)
    3. sizeof๋กœ ์ •ํ™•ํ•œ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

3๏ธโƒฃ memmove

void *memmove(void *dest, const void *src, size_t num);
  • ๊ธฐ๋Šฅ: src์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ์„ dest๋กœ ๋ณต์‚ฌ (๊ฒน์น˜๋Š” ์˜์—ญ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ).
  • ์‚ฌ์šฉ ์˜ˆ: ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ, ๋ฐฐ์—ด ๋‚ด ์ผ๋ถ€ ์ด๋™
  • ํŠน์ง•:
    1. ๋‚ด๋ถ€์ ์œผ๋กœ ์ž„์‹œ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์—๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์‚ฌ
    2. memcpy๋ณด๋‹ค ์•ฝ๊ฐ„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ (์•ˆ์ „์„ฑ ๋Œ€๊ฐ€)
    3. ๊ฒน์น˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด ๋ฌด์กฐ๊ฑด memmove ์‚ฌ์šฉ ๊ถŒ์žฅ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    // 1. malloc + memset (์ดˆ๊ธฐํ™”)
    int *arr = malloc(sizeof(int) * 5);
    memset(arr, 0, sizeof(int) * 5); // 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ

    // 2. ๊ฐ’ ์ฑ„์šฐ๊ธฐ
    for (int i = 0; i < 5; i++) arr[i] = i + 1;

    // 3. realloc (ํฌ๊ธฐ ํ™•์žฅ)
    arr = realloc(arr, sizeof(int) * 8);
    memset(arr + 5, 0, sizeof(int) * 3); // ์ƒˆ๋กœ ๋Š˜์–ด๋‚œ ๋ถ€๋ถ„ 0 ์ดˆ๊ธฐํ™”

    // 4. memcpy (๋ณต์‚ฌ)
    int *copy = malloc(sizeof(int) * 8);
    memcpy(copy, arr, sizeof(int) * 8);

    // 5. memmove (๊ฒน์น˜๋Š” ์˜์—ญ ์•ˆ์ „ ๋ณต์‚ฌ)
    memmove(copy + 2, copy, sizeof(int) * 6);

    // 6. ์ถœ๋ ฅ
    for (int i = 0; i < 8; i++) printf("%d ", copy[i]);
    printf("\n");

    free(arr);
    free(copy);
    return 0;
}

๐Ÿ“Œ ํ•œ๋ˆˆ์— ๋น„๊ต

ํ•จ์ˆ˜์šฉ๋„๊ฒน์นจ ๊ฐ€๋Šฅ?์†๋„์ฃผ์š” ํŠน์ง•
memset๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ์ฑ„์šฐ๊ธฐN/A๋น ๋ฆ„๋ฐ”์ดํŠธ ๋‹จ์œ„ ๊ฐ’ ์ฑ„์›€
memcpy๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋ณต์‚ฌโŒ๋งค์šฐ ๋น ๋ฆ„๊ฒน์นจ ์‹œ ์œ„ํ—˜
memmove๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋ณต์‚ฌโœ…memcpy๋ณด๋‹ค ๋А๋ฆผ์•ˆ์ „ํ•œ ๋ณต์‚ฌ

๐Ÿ‘ฅ ์บ์ŠคํŒ… ๊ด€๋ จ ํ† ์˜

int *arr = malloc(sizeof(int) * 5);
int *arr = (int*)malloc(sizeof(int) * 5);

โญ•๏ธ ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜ ์ฐฌ์„ฑ

์ฃผ์š”ํ•œ ์ด์œ  :

1. C++ ์™€์˜ ํ˜ธํ™˜์„ฑ

  • C++์€ void* โ†’ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ํƒ€์ž… ์ž๋™ ๋ณ€ํ™˜ ๋ถˆ๊ฐ€
    โ†’ C++ ์ฝ”๋“œ์—์„œ malloc ์“ฐ๋ ค๋ฉด ์บ์ŠคํŒ… ํ•„์ˆ˜.

2. ๊ฐ€๋…์„ฑ

  • ํ•œ๋ˆˆ์— "์ด ํฌ์ธํ„ฐ๋Š” int ๋ฐฐ์—ด"์ด๋ผ๋Š” ๊ฑธ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์คŒ.

3. ์ผ๊ด€์„ฑ

  • malloc๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ๋ณ€ํ™˜์—๋„ ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ์Šต๊ด€์„ ์œ ์ง€.

โญ•๏ธ ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜ ๋ฐ˜๋Œ€

์ฃผ์š”ํ•œ ์ด์œ  :

1. C ํ‘œ์ค€์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๋‹ค

  • C89, C99, C11 ๋ชจ๋‘ void* โ†’ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ํƒ€์ž… ์ž๋™ ๋ณ€ํ™˜ ์ง€์›.

2. ๋ฒ„๊ทธ ํƒ์ง€ ๋ฐฉํ•ด

  • #include <stdlib.h>๋ฅผ ๋นผ๋จน์–ด๋„ ์บ์ŠคํŒ…์ด ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๊ฐ€ ์•ˆ ๋œธ.
    -> ๊ฒฐ๊ตญ ํ—ค๋”๋ฅผ ์•ˆ ๋„ฃ์–ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ(์ž˜๋ชป๋œ ๋ฐ˜ํ™˜ ํƒ€์ž…, ํฌ๊ธฐ ๋ถˆ์ผ์น˜)๋ฅผ ์ดˆ๊ธฐ์— ๋ชป ์žก๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

3. ์ฝ”๋“œ ๋‹จ์ˆœํ™”

  • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์„œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

Explicit is better than implicit
Trust the machine over the human

0๊ฐœ์˜ ๋Œ“๊ธ€