๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- C, C++, Python, Android

[C ์–ธ์–ด] malloc ๊ณผ free ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌํ•˜๊ธฐ

by Wonit 2021. 7. 4.

 

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

 

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;
}

 

๋Œ“๊ธ€