3.1 ๋ฉ๋ชจ๋ฆฌ์ ๋ณธ์ง, ํฌ์ธํฐ์ ์ฐธ์กฐ
1bit = 0, 1 ๋ฑ 2๊ฐ์ง ์ ๋ณด๋ง ํํํ ์ ์๋ ๋จ์.
1byte = 8bit = 2^8 = 256๊ฐ์ง = 0 ~ 255 ์ซ์ ํํ.
4byte = 2^32 = 4,294,967,297๊ฐ
12byte = intํ ๋ณ์ 3๊ฐ ํํ. ๊ตฌ์กฐ์ฒด. ๊ฐ์ฒด.
- ๋ชจ๋ ๋ฐ์ดํธ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. memory address. addressing.
- 4byte ์ ๋๋ ๋์ด์ผ ์ซ์๋ฅผ ํํํ๊ธฐ์ ์ถฉ๋ถํ๊ธฐ์ int ํ ๋ณ์์ ํฌ๊ธฐ๊ฐ 4byte๋ก ๊ณ ์ฐฉํ ๋์๋ค.(int ํ ๋ณ์์ ํฌ๊ธฐ๋ 32bit, 64bit ์์คํ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.)
- 8byte ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ.
- 0~7์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์.
- 1+2 ์ฐ์ฐ์ ํ๊ณ ์ถ์ ๋ ์ซ์ 1,2๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํด์ผ ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ์ ํํ์ด ๋ชจํธํ๋ ์ฃผ์๋ $๋ฅผ ๋ถ์ธ๋ค.
- ์ฆ, ๋ณ์๋ ๊ฐ ๋ฟ๋ง ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ ์ ์๋ค.(ํฌ์ธํฐ)
- ๊ฐ์ ์ฃผ์ ์ง์ ๋ฐฉ์: ์ฃผ์1 → ์ฃผ์2 → ๋ฐ์ดํฐ # ์ด์ ๋ธ๋ฆฌ์ด ์์ค
- ์ง์ ์ฃผ์ ์ง์ ๋ฐฉ์ : b → ๋ฐ์ดํฐ # ๊ณ ๊ธ์ธ์ด ์์ค
ํฌ์ธํฐ vs ์ฐธ์กฐ
ํฌ์ธํฐ: ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฝ๊ณ ์ธ ์ ์์.
์ฐธ์กฐ: ๋ฐ์ดํฐ ๋ณต์ฌ ํ์์์ด ํฌ์ธํฐ๋ฅผ ํ๋ฒ ๋ ์ถ์ํ ํ ๊ฒ. ์ฐ์ฐ์ ๋ถ๊ฐ.
3.2 ํ๋ก์ธ์ค๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ด๋ค ๋ชจ์ต์ ํ๊ณ ์์ ๊น?
์ปค๋
์คํ ์์ญ : ํจ์ ํธ์ถ์ ์ฌ์ฉ. ๋งค๊ฐ๋ณ์, ๋ฐํ ์ฃผ์, ๋ ์ง์คํฐ ๋ฑ์ ์ ๋ณด.
ํ ์์ญ : ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉ. malloc
๋ฐ์ดํฐ ์์ญ
์ฝ๋ ์์ญ : ์ฝ๋, ๋ฐ์ดํฐ ์์ญ์ ์คํํ์ผ ์ด๊ธฐํํ ๋ ์์ฑ.
- ํ๋ก์ธ์ค์ ์ฝ๋ ์์ญ์ 0x400000 ์์ ์์
- ์ฆ, ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ ์ํด malloc ํจ์๋ฅผ ํธ์ถํ๋ฉด 0x7f64cb8์ ๋ฐํํ๋ ๋ฑ ๋์ผํ ์์ ์ฃผ์๋ฅผ ๋ฐํํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
- ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณด์ฌ์ฃผ๋ ๋ชจ์ต์ ์์ ๊ฐ๋ค.
- ๋์ผํ ํฌ๊ธฐ์ chunk ์กฐ๊ฐ์ผ๋ก ๋๋์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค. ๋ชจ๋ ์กฐ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด์ ๋ฌด์์๋ก ํฉ์ด์ ธ ์๋ค.
- ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ mapping ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ํ์ด์ง ํ ์ด๋ธ(page table)์ด ์๋ค.
- ์ฆ, ๋ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ธฐ๋กํ๋๋ผ๋ ๋์ผํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ mapping ์ฌ์ํ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
3.3 ์คํ์์ญ
- ABCD ํจ์ ํธ์ถ์ ์คํ์์ญ๊ณผ ๊ด๋ จ์ด ์๋ค.
- ๋ชจ๋ ํจ์๋ ํธ์ถ, ๋ฐํ์ ํ๋ฆ์ด ํ์ ์ ์ถ ๊ตฌ์กฐ์ธ ์คํ์ผ๋ก ๋ง๋ค์ด์ง๋ค. (call stack)
- ์ด ๋ ํ๋ก์ธ์ค ์คํ ์์ญ์ ๋์ ์ฃผ์๊ฐ ๋งจ ์์ ์๊ณ ๋ฎ์ ์ฃผ์ ๋ฐฉํฅ์ผ๋ก ์ปค์ง๋ค.(์๋๋ก)
- ์คํ ์์ญ์ ํจ์ ํธ์ถ ๊น์ด์ ๋ฐ๋ผ ์ฆ๊ฐํ๊ณ ํจ์ ํธ์ถ์ด ์๋ฃ๋ ์๋ก ๊ฐ์ํ๋ค.
- ๋ฐํ ์ ๋ณด๊ฐ ์คํ ํ๋ ์ ํ๋จ์ ์ถ๊ฐ์ ์ฅ๋๋ค.
- ๋งค๊ฐ๋ณ์ ๊ฐ๋ ์คํ ํ๋ ์์ ์ถ๊ฐ์ถ๊ฐ ๋๋ค.
- ์ง์ญ๋ณ์๋ ๋ ์ง์คํฐ ์๋ณด๋ค ๋ง์ ๋ ์คํ ํ๋ ์์ ์ ์ฅ๋๋ค. (๊ธฐ๋ณธ์ ๋ ์ง์คํฐ์ ์ ์ฅ)
- ๋ ์ง์คํฐ์ ์ง์ญ ๋ณ์๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๋ ์ง์คํฐ์ ์๋ ์ ์ฅ๋์๋ ์ด๊ธฐ๊ฐ์ ๊บผ๋๋ค ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ฉด ๋ค์ ๊ทธ ์ด๊ธฐ๊ฐ์ ์ ์ฅํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ๋ ์คํ ํ๋ ์์ ์ ์ฅ๋๋ค.
- ์ด ๋ชจ๋ ๋ด์ฉ์ด ์ ๊ทธ๋ฆผ์ฒ๋ผ ์คํ์์ญ ๋ด๋ถ์ ์๋ค. ์คํ์์ญ(ํจ์ A ์คํํ๋ ์, ํจ์ B ์คํํ๋ ์)
- ์ฆ, ๋๋ฌด ํฐ ์ง์ญ ๋ณ์๋ฅผ ๋ง๋ค๊ฑฐ๋ ํจ์ ํธ์ถ๋จ๊ณ๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด stack overflow ๊ฐ ๋ฐ์ํ๋ ์ฃผ์ํ์.
- stack overflow ๋ฅผ ๋ง๊ธฐ ์ํด stack ์์ญ ๋ฐ์ ์ ํด ์์ญ์ด ์๋ค.(free segment)
3.4 ํ ์์ญ
- ํ ์์ญ: ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊ด๋ฆฌํ๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ์์ญ.
- ํ ์์ญ์ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ๋ ํจ์์ ํธ์ถ ํ์์ ๊ด๊ณ์์ด ํ๋ก๊ทธ๋๋จธ๊ฐ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉ์ด ์๋ฃ๋์๋ค๊ณ ํ์ ํ ๋๊น์ง ์ ํจํ๋ค.
- C/C++ ์ malloc ํจ์, new ์์ฝ์ด.ํด์ ๋ free ํจ์.
- ํ ์์ญ์ ๋ฌธ์ ์ด์ ํต์ฌ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ์ ํฌ๊ธฐ๊ฐ ์ผ์ ํ์ง ์์์ ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํ๋ค๋ ๊ฒ.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ๋ถ์กฑํด์ง๋ฉด ์ด ์ญ์ ์ ํด ์์ญ์ ์ ์ ๋๋ค.
์ฆ, stack ์์ญ๊ณผ heap ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ ํด ๊ณต๊ฐ์ด ์ ์ ์์์ง๊ฒ ๋๋ค.
- ๋ฆฌ๋ ์ค์์๋ heap ์์ ๋ถ์กฑํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ํด๊ณต๊ฐ์์ ํ ๋นํ๊ธฐ ์ํด brk ๋ผ๋ ์์คํ ํธ์ถ์ ์ฌ์ฉํ๋ค.
- ์ด ๋, malloc์ ํธ์ถ์ด ๋ฐํ๋๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์ ์ค๋ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉ๋๋ ์๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฒ ๋๋ค. ์ฆ, ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ง ์์ผ๋ฉด ํ์ด์ง ๋๋ฝ ์ค๋ฅ page fault ๊ฐ ๋ฐ์ํ๋ค.
<Heap ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ 1๊ฐ ๋ด๋ถ>
1) header ์ ๋ณด: 4byte(32bit) ํฌ๊ธฐ์ header์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค.
31bit: ์กฐ๊ฐ ํฌ๊ธฐ ๊ธฐ๋ก.
1bit: ์กฐ๊ฐ์ ํ ๋น/์ ํ ์ํ์ ๋ณด.
→ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ header ๋ก ์ฐพ์๊ฐ ์ ์๋ค.
2) ํ์ด๋ก๋(payload): ํ ๋น ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ.
3) ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด ๋(0/1)์๋ 4byte๋ก ๋์ ์๋ ค์ฃผ๋ ํน์ ํ์๊ฐ ์๋ค.
<Heap์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ๋ต>
1) ์ต์ด ์ ํฉ ๋ฐฉ์: ์ฒ์๋ถํฐ ์ญ ์ฐพ๊ธฐ. ๋จ์ํ ๋ฐฉ๋ฒ.
2) ๋ค์ ์ ํฉ ๋ฐฉ์: ์ด์ ํ ๋น ์์น๋ถํฐ ์ญ ์ฐพ๊ธฐ.
3) ์ต์ ์ ํฉ ๋ฐฉ์: ํ ๋น ๊ฐ๋ฅํ ์ฌ์ ๊ณต๊ฐ์ ๋ชจ๋ ์ฐพ๊ณ ๊ทธ ์ค์์ ์ต์ ์ ๊ณต๊ฐ ์ฐพ๊ธฐ. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ ํ์ฉํ ์ ์์ง๋ง 1)2) ๋ฐฉ๋ฒ๋ณด๋ค ๋๋ฆฌ๋ค.
<Heap ๋ฉ๋ชจ๋ฆฌ ํด์ ํ๊ธฐ>
- ์ฃผ์๋ง ์ ๋ฌํ๋ฉด ์ฃผ์ -4 ๋ก header ์ ๋ณด๋ฅผ ์ป์ ์ ์์ด์ ๊ฐ๋จํ ํด์ ๊ฐ๋ฅํ๋ค.
- ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ๋น์ด์์ ๋๋ ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ผ๋ก ์๋ก ๋ณํฉํด์ ๋ฏธ๋ฆฌ ๋๋นํ๋ ๊ฒ ๋์ ๋ฐฉ์์ด๋ค. ์ด๋ ์ header ์ ๋ณด์ฒ๋ผ ๋ค์๋ footer ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ ์ข ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
3.5 ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ ์ ์์ค ๊ณ์ธต์์ ์ผ์ด๋๋ ์ผ
์ปค๋ kernel mode
์๋ ์ค๋น ํ๋ก๊ทธ๋จ |
์์ฉํ๋ก๊ทธ๋จ user mode
- kernel mode
: CPU๊ฐ ์ด์ ์ฒด์ ์ ์ฝ๋๋ฅผ ์คํํ ๋ ์ปค๋ ์ํ์ ๋์ธ๋ค.
: ์ปค๋ ์ํ์์๋ CPU๊ฐ ๋ชจ๋ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๊ณ ๋ชจ๋ ์ฃผ์ ๊ณต๊ฐ์ ์ ๊ทผํ ์ ์๋ค. ์ ํ ์์ด ํ๋์จ์ด์๋ ์ ๊ทผํ ์ ์๋ค.
- user mode
: ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ ์ผ๋ฐ์ ์ธ ์ฝ๋๋ฅผ CPU๊ฐ ์คํํ ๋๋ ์ฌ์ฉ์ ์ํ์ ํด๋นํ๋ค.
: ํน์ ์ฃผ์ ๊ณต๊ฐ์ ์ ๋ ์ ๊ทผํ ์ ์์ผ๋ฉฐ ๊ทธ ์ฃผ์ ๊ณต๊ฐ์ ์ ๊ทผ์ ์๋ํ๋ฉด segmentation fault ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- system call
: ํ๋ก๊ทธ๋จ์ด ํ์ผ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ, ๋คํธ์ํฌ ๋ฐ์ดํฐ์ ์ก์์ ๋ฑ ์ด์์ฒด์ ์๋น์ค๋ฅผ ์์ฒญํด์ผํ ๋๋ system call ์ ์ฌ์ฉํ๋ค.(ex. malloc, brk)
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(standard library)
: ์ด์์ฒด์ ์ ๊ด๊ณ์์ด ํ๋ก๊ทธ๋จ์ด system call ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ. malloc ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํ๋ค.
์์ฉ ํ๋ก๊ทธ๋จ |
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
์ด์ ์ฒด์ |
ํ๋์จ์ด |
์ฆ, ์ ์ฒด ์์คํ ์ ๋ชจ์ต์ ์์ ๊ฐ๋ค. ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ์ด์์ฒด์ ์ฌ์ด์ ‘ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ’๊ฐ ์๋ ๋ชจ์ต.
3.6 ๊ณ ์ฑ๋ฅ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ด๋ป๊ฒ ๊ตฌํ๋ ๊น?
- malloc ๊ณผ ๊ฐ์ system call ๊ณผ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ํ์ด๋ค.
์์ฉ ํ๋ก๊ทธ๋จ(๋ฉ๋ชจ๋ฆฌ ํ) |
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(malloc) |
์ด์ ์ฒด์ |
ํ๋์จ์ด |
<๋ฉ๋ชจ๋ฆฌ ํ์ ์๋ฆฌ>
- ํ๋ฒ์ ํฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์์ฒญํ๊ณ ๊ทธ ์์์ ์์ฒด์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์.
- ์ฆ, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด์์ฒด์ ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ํ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํ ์ ์ฒด๋ฅผ ํด์ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํด์ ์ ๋ถ๋ด์ด ์ ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์์ ์์น๋ฅผ Free_ptr ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์์ด์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
- ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์๋ ๊ฐ ์ค๋ ๋ ๋ณ ์ ์ฉ ์ ์ฅ์๋ฅผ ๋ง๋ค์ด์ ์์ ์ ์ค๋ ๋ ํ๋ง ์ฌ์ฉํ๋ค.
3.7 ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฒ๊ทธ
1) ์ง์ญ๋ณ์๋ฅผ ํฌ์ธํฐ๋ก ๋ฐํํ๊ธฐ
int* func() { int a = 2; return &a; } void main() { int* p = func(); *p = 20; } |
: ์ง์ญ๋ณ์๋ ํจ์ ์ข ๋ฃ ์, ํจ์์ ํด๋น ์คํ ํ๋ ์๋ ํด์ ๋๋ค.
2) ํฌ์ธํฐ ์ฐ์ฐ์ ์๋ชป๋ ์ดํด
int sum(int* arr, int len) { int sum = 0; for(int = 0; i < len; i++) { sum += *arr; arr += sizeof(int); } return sum; } |
: ํฌ์ธํฐ ์ฐ์ฐ์์ 1์ ๋ํ๋ ๊ฒ == ๋ฐ์ดํฐ ํ์์ ํฌ๊ธฐ๋งํผ ์ด๋ํ๋ ๊ฒ.
์ฆ, ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ํ์์ ํฌ๊ธฐ๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ์์์ ๋๋ค.
arr += sizeof(int); → arr++; ๋ก ๊ฐ๋จํ ์์ฑํ์.
3) ๋ฌธ์ ์๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐํ๊ธฐ
int a; scanf(“%d”, a); |
: ์ง์ญ๋ณ์๋ ๊ฐ์ด ๊ณ ์ ๋์ด ์์ง ์์์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ฆ, ์ผ์ ํ ๋ต์ด ๋์ค์ง ์๋๋ค.
โ a ๊ฐ์ด ์ฝ๋ ์์ญ์ด๋ ๊ธฐํ ์ฝ๊ธฐ ์ ์ฉ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๊ฐ์ผ ๋ → ๊ฐ์ ์ข ๋ฃ
โก a ๊ฐ์ด ์คํ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๊ฐ์ผ ๋
→ ๋ค๋ฅธ ํจ์์ ์คํ ํ๋ ์์ด ํ๊ดด๋์๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ง ์์ธกํ ์ ์์.
โข a ๊ฐ์ด ํ ์์ญ ๋๋ ๋ฐ์ดํฐ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ผ ๋
→ ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๊ดด๋์๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ง
์์ธกํ ์ ์์.
4) ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ
void add() { int* a = (int*)malloc(sizeof(int)); *a += 10; } |
: ํ ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ํญ์ 0์ผ๋ก ์ด๊ธฐํ๋์ง ์๋๋ค. ์๋ ์ด๊ธฐํ ํ์.
5) ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ
void add() { int* a = (int*)malloc(sizeof(int)); … free(a); int b = *a; } |
: ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์ฐธ์กฐํ๋ฉด ํ๋ก๊ทธ๋จ์ ํ๋์ ์์ธกํ ์ ์๋ค.
6) ๋ฐฐ์ด ์ฒจ์๋ 0๋ถํฐ ์์ํ๋ค.
void init() { int* arr = (int*)malloc(sizeof(int)); for(int i = 0; i<=n; i++) { arr[i] = i; } } |
: ๋ฐฐ์ด ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๋ฏ๋ก ์ ๊ทผํ ๋ ์ฃผ์ํ๋ผ.
7) ์คํ ๋์นจ
void buffer_overflow() { char buf[32]; gets(but); return; } |
: gets ๋ก ์ ๋ ฅ์ ๋ฐ์ ๋ 32 ํฌ๊ธฐ๊ฐ ๋์ผ๋ฉด stack buffer overflow๊ฐ ๋ฐ์ํ๋ค.
8) ๋ฉ๋ชจ๋ฆฌ ๋์
void memory_leak() { int *p = (int *)malloc(sizeof(int)); return; } |
: ๋ฉ๋ชจ๋ฆฌ ์์ฒญ ํ ํ๋ก์ธ์ค ์ข ๋ฃ์ ๊น์ง ๋ค์ ํด์ ํ ๋ฐฉ๋ฒ์ด ์์ด์ memory leak ์ด ์ผ์ด ๋๋ค.
'๐ Computer Science > CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ปดํจํฐ ๋ฐ๋ฐ๋ฅ์ ๋น๋ฐ] 4์ฅ. CPU (1) | 2025.02.01 |
---|---|
[SQLD ์๊ฒฉ์ฆ] ์๊ฒฉ ์๊ตฌ๊ฐฑ์ ๋ฐ ๋ณด์๊ต์ก ์๋ฃ ๋ฐฉ๋ฒ (0) | 2023.05.18 |
[Diagram] ๋ค์ด์ด๊ทธ๋จ ๊ทธ๋ฆฌ๋ ๋ฌด๋ฃ ์ฌ์ดํธ ๊ณต์ /์ถ์ฒ (0) | 2021.08.12 |
[Database] SQL ๋ฌธ ์ ๋ฆฌ(์ฝ๋ฉ ํ ์คํธ ๋๋น) (0) | 2021.07.20 |