🀷🏼‍♀️ Etc.../- C, C++, Python, Android

[C μ–Έμ–΄] malloc κ³Ό free 둜 λ©”λͺ¨λ¦¬ κ΄€λ¦¬ν•˜κΈ°

Wonit 2021. 7. 4. 14:25

 

λ©”λͺ¨λ¦¬ ꡬ쑰

 

C μ–Έμ–΄κ°€ λ§Žμ€ μ‚¬λž‘μ„ λ°›λŠ” μ΄μœ λŠ” λ°”λ‘œ λ©”λͺ¨λ¦¬κ°€ μ•„λ‹κΉŒ μƒκ°ν•œλ‹€κ³  첫 μ‹œκ°„μ— 이야기λ₯Ό ν–ˆμ—ˆλ‹€.

 

μ˜€λŠ˜μ€ C μ–Έμ–΄μ˜ 핡심 쀑 ν•˜λ‚˜μΈ λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ˜ 기본에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€.

 

κ·Έ 전에 λ¨Όμ € λ©”λͺ¨λ¦¬μ˜ ꡬ쑰에 λŒ€ν•΄μ„œ μ•Œμ•„μ•Όν•˜λŠ”λ°, λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” 총 4개둜 λ‚˜λ‰˜μ–΄ μ§„λ‹€.

 

  1. μŠ€νƒ μ˜μ—­
  2. νž™ μ˜μ—­
  3. 데이터 μ˜μ—­
  4. μ½”λ“œ μ˜μ—­

 

μ—¬κΈ°μ„œ μŠ€νƒκ³Ό νž™μ— μ£Όλͺ©μ„ ν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€.

 

μŠ€νƒ μ˜μ—­

 

컴파일 μ‹œμ μ— λ©”λͺ¨λ¦¬κ°€ κ²°μ •λ˜μ–΄ μ‹€ν–‰ 속도가 λΉ λ₯΄κ³  λ‚­λΉ„κ°€ μ—†λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

ν•˜μ§€λ§Œ μŠ€νƒ μ˜μ—­μ€ μƒλŒ€μ μœΌλ‘œ ν•œκ³„κ°€ 있기 λ•Œλ¬Έμ— μŠ€νƒ 이상을 μ“°κ²Œλœλ‹€λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  κ°€λŠ₯성이 μ‘΄μž¬ν•œλ‹€.

 

νž™ μ˜μ—­

 

μ‚¬μš©μžκ°€ 직접 μƒμ„±ν•˜λŠ” ν˜Ήμ€ ν• λ‹Ήν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀.

 

Java μ—μ„œλŠ” GCκ°€ λ™μž‘ν•˜μ—¬ ν™œμ•½ν•˜λŠ” 곡간이라고 생각할 수 μžˆλ‹€.

 

νž™μ€ μ΅œμ ν™”λ₯Ό ν•  λ•Œλ„ μ‚¬μš©λ˜λ©° μŠ€νƒλ³΄λ‹€ 큰 데이터λ₯Ό ν• λ‹Ήν•  λ•Œλ„ μ‚¬μš©λ˜κΈ΄ ν•˜μ§€λ§Œ μ‚¬μš©μžκ°€ 직접 만질 수 μžˆλŠ” 곡간이기 λ•Œλ¬Έμ— μ•„λ¬΄λž˜λ„ νž™ 손상이 λ°œμƒν•˜κΈ° 쉽닀.

 

C μ–Έμ–΄μ—μ„œ λ©”λͺ¨λ¦¬ μ‚¬μš©ν•˜κΈ°

 

c μ–Έμ–΄μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό μ‘°μž‘ν•  λ•ŒλŠ” mallocκ³Ό free λ₯Ό μ΄μš©ν•˜λŠ”κ²Œ μΌλ°˜μ μ΄λ‹€.

 

  1. malloc 으둜 λ©”λͺ¨λ¦¬ ν• λ‹Ήν•˜κΈ°
  2. μ‚¬μš©ν•˜κΈ°
  3. free 둜 할당받은 λ©”λͺ¨λ¦¬ ν•΄μ œν•˜κΈ°

 

의 과정을 거치게 λ˜λŠ”λ°, μ’€ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄μž

 

mallocκ³Ό free

 

mallocκ³Ό free 와 같은 λ©”λͺ¨λ¦¬ κ΄€λ ¨ ν•¨μˆ˜λŠ” stdlib.h 헀더에 μ‘΄μž¬ν•˜λ―€λ‘œ malloc, free, memcpy, memset 을 μ‚¬μš©ν•˜λ €λ©΄ ν•΄λ‹Ή 헀더λ₯Ό include ν•΄μ•Ό ν•œλ‹€.

 

malloc

 

λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ” ν•¨μˆ˜λ‘œ Memory + Allocation의 ν•©μ„± μ•½μžλ‘œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  λ©”λͺ¨λ¦¬ 블둝을 ν• λ‹Ήν•œλ‹€.

 

malloc ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ λ§€κ°œλ³€μˆ˜λ‘œ size λ₯Ό μ§€μ •ν•˜μ—¬ μ‚¬μš©μžκ°€ μ–Όλ§ŒνΌμ˜ λ©”λͺ¨λ¦¬λ₯Ό 할당받을 것인지 λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

 

free

 

μ•žμ—μ„œ λ³Έ malloc 으둜 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν–ˆλ‹€λ©΄ Heap 손상을 λ°œμƒμ‹œν‚€μ§€ μ•ŠκΈ° μœ„ν•΄μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œμ‹œμΌœμ•Ό ν•œλ‹€.

 

λ§Œμ•½ λ©”λͺ¨λ¦¬ 할당을 ν•΄μ œν•˜μ§€ μ•ŠμœΌλ©΄ 후속 ν• λ‹Ήμ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ μ ˆν•˜κ²Œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œμ‹œμΌœμ•Ό ν•œλ‹€.

 

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

int main() {

    int number = 100;

    int *pointer1 = &number;
    int *pointer2 = malloc(sizeof(number));

    printf("address: %010x \n", pointer1);
    printf("address: %010x \n", pointer2);

    free(pointer2);
    return 0;
}

 

λ©”λͺ¨λ¦¬μ— 값을 μ €μž₯ν•˜κΈ°

 

μ•žμ„  μ½”λ“œμ—μ„œλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή ν•˜κ³  ν•΄μ œ ν•˜λŠ” κ³Όμ •μ΄μ—ˆλ‹€.

 

μ΄λ²ˆμ—λŠ” 할당받은 λ©”λͺ¨λ¦¬μ— μ—­μ°Έμ‘°λ₯Ό μ΄μš©ν•˜μ—¬ νŠΉμ • 값을 μ €μž₯ν•΄λ³΄μž.

 

#include <assert.h>
#include <stdlib.h>

int main() {

    int number = 100;

    int *pointer1 = &number;
    int *pointer2 = malloc(sizeof(number));

    *pointer2 = number;

    assert(*pointer1 == *pointer2);

    free(pointer2);
    return 0;
}