C: Memory Layout of C Programs

Cμ–Έμ–΄λ‘œ λ™μž‘ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λŠ” 크게 4κ°€μ§€μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­(text, data, heap, stack)을 톡해 κ΅¬μ„±λœλ‹€. μ „μ—­ λ³€μˆ˜, μ§€μ—­λ³€μˆ˜ λ“± μ‚¬μš©λ˜λŠ” μœ„μΉ˜λ‚˜ ν‚€μ›Œλ“œ 등에 따라 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ λ‹¬λΌμ§€κ²Œ λœλ‹€. μž‘μ€ ν”„λ‘œκ·Έλž¨ λ‹¨μœ„μ—μ„œλŠ” 크게 μ‹ κ²½ 쓰지 μ•Šμ•„λ„ λ˜μ§€λ§Œ, λ‹€λ£¨λŠ” 자료ꡬ쑰의 크기가 큰 경우 stack overflow와 같은 였λ₯˜μ— 직면할 수 μžˆλ‹€. μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•œ λͺ…ν™•ν•œ 이해가 ν•„μš”ν•˜λ‹€. Memory Layout stack & heap stack ν•¨μˆ˜ 호좜 μ‹œ μƒμ„±λ˜κ³ , ν•¨μˆ˜ μ’…λ£Œ μ‹œ λ°˜ν™˜λ˜λŠ” μ˜μ—­μ΄λ‹€. 즉 지역 λ³€μˆ˜(local variable)이 ν• λ‹Ήλ˜λŠ” μ˜μ—­μ΄λ‹€. heap λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ³€μˆ˜λ₯Ό μœ„ν•œ μ˜μ—­μ΄λ‹€. 예λ₯Ό λ“€λ©΄, malloc λ˜λŠ” calloc을 ..

C: Storage class specifier

κΈ°μ–΅ 클래슀 μ§€μ •μž(Storage class specifiler)λŠ” λ³€μˆ˜λ₯Ό μœ„ν•œ κΈ°μ–΅μž₯치 ν• λ‹Ή κ΄€λ¦¬μ˜ νš¨μœ¨μ„±μ„ λ‹΄λ‹Ήν•œλ‹€. λ˜ν•œ λ©”λͺ¨λ¦¬, λ ˆμ§€μŠ€ν„°, μŠ€νƒ λ“± 어디에 ν• λ‹Ήν•˜λŠλƒμ— 따라 scope와 life time이 λ‹¬λΌμ§€κ²Œ λœλ‹€. λ”°λΌμ„œ 각 κΈ°μ–΅ ν΄λž˜μŠ€μ— λŒ€ν•œ νŠΉμ§•μ„ λͺ…ν™•νžˆ μ•Œκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€. auto ν”νžˆ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λ‘œ, 아무것도 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ `auto` ν‚€μ›Œλ“œκ°€ λΆ™κ²Œ λœλ‹€. μ΄λŠ” μ„ μ–Έλœ μ˜μ—­ λ˜λŠ” ν•¨μˆ˜λ₯Ό λ²—μ–΄λ‚˜λ©΄ μ‚¬λΌμ§€κ²Œ 되며, μ‹€ν–‰ μ€‘μ—λŠ” λ©”λͺ¨λ¦¬μ˜ `stack`에 μœ„μΉ˜ν•˜κ²Œ λœλ‹€. register ν•΄λ‹Ή ν‚€μ›Œλ“œλ₯Ό μ§€μ •ν•œ λ³€μˆ˜λ₯Ό CPU의 `register`에 μ €μž₯ν•˜λ„λ‘ μš”μ²­ν•  λ•Œ μ‚¬μš©ν•œλ‹€. μ΄λŠ” μ»΄νŒŒμΌλŸ¬μ— 따라 μ‚¬μš©μžκ°€ `register`라고 λͺ…μ‹œν•˜μ˜€μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  `auto`..

C: fork()

λ¦¬λˆ…μŠ€μ—μ„œ λ‚΄κ°€ μ›ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό ν• λ‹Ήν•˜κΈ° μœ„ν•΄, μœ μ € λ ˆλ²¨μ—μ„œ fork()λ₯Ό ν™œμš©ν•˜μ—¬ λ‚˜μ˜ μ‹€ν–‰ ν”„λ‘œκ·Έλž¨μ„ λΆ€λͺ¨λ‘œ ν•˜λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 수 μžˆλ‹€. fork()κ°€ μ–΄λ–€ μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ μ •ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€λ©΄, μ›μΉ˜ μ•ŠλŠ” κ²°κ³Όλ₯Ό λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ μ •λ¦¬ν•΄λ³΄κ³ μž ν•œλ‹€. fork μ‚΄νŽ΄λ³΄κΈ° λ¦¬λˆ…μŠ€μ—μ„œ μœ„μ™€ 같이 `man fork`λ₯Ό μž…λ ₯ν•˜λ©΄ `fork()`에 λŒ€ν•œ μ„€λͺ…이 λ‚˜μ˜¨λ‹€. κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄, `fork()`λ₯Ό ν˜ΈμΆœν•˜λŠ” ν”„λ‘œμ„ΈμŠ€, 즉 λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ œν•œ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•œλ‹€. λ˜ν•œ, μ‹€ν–‰ 결과에 따라 λ°˜ν™˜ 결과도 μƒμ΄ν•˜λ‹€. μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν• λ‹Ήν•  수 μ—†λŠ” κ²½μš°λŠ” `-1`을 λ°˜ν™˜ν•œλ‹€. λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ 경우 μƒμ„±ν•œ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ `pid`λ₯Ό λ°˜ν™˜ν•˜λ©°, μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ 경우 `0`을..

C: 동적 ν• λ‹Ήκ³Ό ν™œμš©

λ ‰ν† ν”Όμ•„ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ˜ Secure & Generic C κ°•μ˜λ₯Ό λ“£κ³ , μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ˜ μ €μž‘κΆŒμ€ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ—κ²Œ μžˆμŠ΅λ‹ˆλ‹€. 동적 ν• λ‹Ή user levelμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 동적 ν• λ‹ΉμœΌλ‘œλŠ” λŒ€ν‘œμ μœΌλ‘œ `malloc`κ³Ό `calloc`이 μžˆλ‹€. `malloc`은 μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ή ν›„ λ³„λ„μ˜ μ΄ˆκΈ°ν™”κ°€ μ—†μ–΄ μ“°λ ˆκΈ° 값을 κ°™λŠ”λ‹€. 이와 달리 `calloc`은 λ©”λͺ¨λ¦¬ 곡간 ν• λ‹Ή 후에 ν• λ‹Ήλœ 곡간을 λͺ¨λ‘ 0으둜 μ΄ˆκΈ°ν™” ν•œλ‹€. malloc malloc은 parameter둜 ν• λ‹Ήν•˜κ³ μž ν•˜λŠ” 크기λ₯Ό λ°›λŠ”λ‹€. 보톡은 ν• λ‹Ήν•˜κ³ μž ν•˜λŠ” κ³΅κ°„μ˜ 데이터 νƒ€μž…μ— 따라 `sizeof(데이터 νƒ€μž…)` 연산을 톡해 ν• λ‹Ήν•œλ‹€. λ§Œμ•½ malloc을 μ‚¬μš©ν•˜μ—¬ 크기가 5인 int 1차원 배열을 ν• λ‹Ήν•œλ‹€λ©΄ ..

κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€