๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
C ์ธ์ด๊ฐ ๋ง์ ์ฌ๋์ ๋ฐ๋ ์ด์ ๋ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๊น ์๊ฐํ๋ค๊ณ ์ฒซ ์๊ฐ์ ์ด์ผ๊ธฐ๋ฅผ ํ์๋ค.
์ค๋์ C ์ธ์ด์ ํต์ฌ ์ค ํ๋์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
๊ทธ ์ ์ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์กฐ์ ๋ํด์ ์์์ผํ๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ์ด 4๊ฐ๋ก ๋๋์ด ์ง๋ค.
- ์คํ ์์ญ
- ํ ์์ญ
- ๋ฐ์ดํฐ ์์ญ
- ์ฝ๋ ์์ญ
์ฌ๊ธฐ์ ์คํ๊ณผ ํ์ ์ฃผ๋ชฉ์ ํด๋ณผ ํ์๊ฐ ์๋ค.
์คํ ์์ญ
์ปดํ์ผ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฒฐ์ ๋์ด ์คํ ์๋๊ฐ ๋น ๋ฅด๊ณ ๋ญ๋น๊ฐ ์๋ค๋ ํน์ง์ด ์๋ค.
ํ์ง๋ง ์คํ ์์ญ์ ์๋์ ์ผ๋ก ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ ์ด์์ ์ฐ๊ฒ๋๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค.
ํ ์์ญ
์ฌ์ฉ์๊ฐ ์ง์ ์์ฑํ๋ ํน์ ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
Java ์์๋ GC๊ฐ ๋์ํ์ฌ ํ์ฝํ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
ํ์ ์ต์ ํ๋ฅผ ํ ๋๋ ์ฌ์ฉ๋๋ฉฐ ์คํ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ ๋๋ ์ฌ์ฉ๋๊ธด ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ง์ ๋ง์ง ์ ์๋ ๊ณต๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ฌด๋๋ ํ ์์์ด ๋ฐ์ํ๊ธฐ ์ฝ๋ค.
C ์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉํ๊ธฐ
c ์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ํ ๋๋ malloc๊ณผ free ๋ฅผ ์ด์ฉํ๋๊ฒ ์ผ๋ฐ์ ์ด๋ค.
- malloc ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๊ธฐ
- ์ฌ์ฉํ๊ธฐ
- 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;
}
๋๊ธ