ν‹°μŠ€ν† λ¦¬ λ·°

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

 

Memory Layout

https://aticleworld.com/memory-layout-of-c-program/

 

stack & heap

  •  stack
    • ν•¨μˆ˜ 호좜 μ‹œ μƒμ„±λ˜κ³ , ν•¨μˆ˜ μ’…λ£Œ μ‹œ λ°˜ν™˜λ˜λŠ” μ˜μ—­μ΄λ‹€.
    • 즉 지역 λ³€μˆ˜(local variable)이 ν• λ‹Ήλ˜λŠ” μ˜μ—­μ΄λ‹€.
  • heap
    • λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ³€μˆ˜λ₯Ό μœ„ν•œ μ˜μ—­μ΄λ‹€.
    • 예λ₯Ό λ“€λ©΄, malloc λ˜λŠ” calloc을 톡해 ν• λ‹Ήλ˜λŠ” 경우 ν•΄λ‹Ή μ˜μ—­μ— ν• λ‹Ήλœλ‹€.

`stack`κ³Ό `heap`은 같은 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄μ§€λ§Œ `heap`은 low addressμ—μ„œ high address둜 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³ , `stack`은 이와 λ°˜λŒ€μ΄λ‹€. λ§Œμ•½ `stack`이 `heap`의 μ˜μ—­μ„ μΉ¨λ²”ν•˜κ²Œ 되면, `stack overflow`이며 이와 λ°˜λŒ€μΌ 경우 `heap overflow`이닀.

 

data

#include <stdio.h>

/* global variable stored in in initalized data (RW) */
char c1[] = "test1...";
/* global variable stored in in initalized data (RO)*/
const char s[] = "test2...";

/* Uninitialized variable stored in BSS */
char c2;

int main()
{
    /* static variable stored in initalized data */
    static int i = 1;
    /* Uninitialized static variable stored in BSS */
    static int j;
    
    return 0;
}
  • uninitialized data (bss)
    • μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μ „μ—­, 정적 λ³€μˆ˜κ°€ ν• λ‹Ήλ˜λŠ” μ˜μ—­μ΄λ‹€.
    • λŸ°νƒ€μž„μ— ν•΄λ‹Ή μ˜μ—­μ„ 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
  • initialized data
    •  μ΄ˆκΈ°ν™”λœ μ „μ—­, 정적 λ³€μˆ˜κ°€ ν• λ‹Ήλ˜λŠ” μ˜μ—­μ΄λ‹€.

 

text

  • ν”„λ‘œκ·Έλž¨ μ½”λ“œ(μ†ŒμŠ€μ½”λ“œ), ν•¨μˆ˜, μ „μ—­ μƒμˆ˜, λ¬Έμžμ—΄ 등이 ν• λ‹Ήλ˜λŠ” μ˜μ—­μ΄λ‹€.
  • 읽기 μ „μš© μ˜μ—­μ΄λ‹€.

 

File size & Time

 μ‹€ν–‰ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ `File size`λŠ” `text + data` μ˜μ—­μ— μ˜ν•΄ κ²°μ •λœλ‹€. λ˜ν•œ `run time`은 `heap`의 크기에 따라 κ²°μ •λ˜λ©°, `compile time`은 `stack`의 크기에 따라 κ²°μ •λœλ‹€.

 

Reference

 

728x90
λ°˜μ‘ν˜•

'πŸ™‹β€β™‚οΈ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ > C' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

C: Signal  (0) 2021.06.11
C: thread safe and reentrant  (0) 2021.01.26
C: Storage class specifier  (0) 2020.11.27
C: fork()  (0) 2020.11.25
C: 동적 ν• λ‹Ήκ³Ό ν™œμš©  (0) 2020.11.20
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€