κ°μΈ κ³΅λΆ κ³Όμ μ κΈ°λ‘ν©λλ€.
νμ μμ μΌ νκ³ CSμ μ€μμ±μ λλΌλ©΄μ λ°°μ°κ² λ CSμ κΈ°μ΄λ€.. κ·Έ μ€ μ€λμ μ»΄ν¨ν°κ° λ³μλ₯Ό μ²λ¦¬νλ λ°©λ²μ λν΄ μ λ¦¬ν΄ λ³Έλ€.
π What I Will Learn
- CμΈμ΄μμ μ¬μ©νλ λ€μν λ³μλ₯Ό μ²λ¦¬νλ λ°©λ² μ΅νκΈ°
- μ§μ λ³μ, μ μ λ³μ, λ μ§μ€ν° λ³μ λ±μ λν΄ μ΄ν΄νκΈ°
- νΉμ ν ν¨μμ κ°μ μ λ¬νκ±°λ μ£Όμλ₯Ό μ λ¬νλ λ°©λ² μ΄ν΄νκΈ°
μ»΄ν¨ν°κ° λ³μλ₯Ό μ²λ¦¬νλ λ°©λ²
βοΈ νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬ μ£Όμ
-
μ»΄ν¨ν°μμ νλ‘κ·Έλ¨μ΄ μ€νλκΈ° μν΄μλ νλ‘κ·Έλ¨μ΄ λ©λͺ¨λ¦¬μ μ μ¬(Load)λμ΄μΌ νλ€
-
(λΉμ°ν) νλ‘κ·Έλ¨ ν¬κΈ°λ₯Ό μΆ©λΉν μ μμ λ§νΌμ λ©λͺ¨λ¦¬ 곡κ°μ΄ μμ΄μΌ νλ€
- νν, μ»΄ν¨ν°λ€μ λ©λͺ¨λ¦¬ μ¬μμ 8GB, 16GB, 32GB μ λ λλλ°
- νΉμ ν νλ‘κ·Έλ¨μ λλΈ ν΄λ¦ν΄μ μ€ννλ©΄ κ·Έ νλ‘κ·Έλ¨μ΄ λ©λͺ¨λ¦¬μ μ μ¬λμ΄ μ€νλλ€
-
μΌλ°μ μΈ μ»΄ν¨ν°μ μ΄μ체μ λ λ©λͺ¨λ¦¬(RAM) 곡κ°μ λ€ κ°μ§λ‘ ꡬλΆνμ¬ κ΄λ¦¬νλ€.
μ½λ μμ
: μ½λλ₯Ό νμ€μ© μ€νμν€λ μμλ°μ΄ν° μμ
: μ μλ³μ νΉμ μ μ λ³μλ₯Ό λ΄κ³ μλ€. νλ‘κ·Έλ¨μ μμκ³Ό λμμ ν λΉλκ³ , νλ‘κ·Έλ¨μ΄ μ’ λ£λμ΄μΌ λ©λͺ¨λ¦¬κ° μλ©Έλλ μμν μμ
: κ°λ°μκ° ν λΉ/ν΄μ νλ λ©λͺ¨λ¦¬ 곡κ°μ΄λ€. κ°λΉμ§ 컬λ ν°κ° μλμΌλ‘ ν΄μ νλ€. μ΄ κ³΅κ°μ λ©λͺ¨λ¦¬ ν λΉνλ κ²μ λμ ν λΉ(Dynamic Memory Allocation)μ΄λΌκ³ λ λΆλ₯Έλ€.μ€ν μμ
: νλ‘κ·Έλ¨μ΄ μλμΌλ‘ μ¬μ©νλ μμ λ©λͺ¨λ¦¬ μμ. ν¨μ νΈμΆ μ μμ±λλ μ§μ λ³μμ 맀κ°λ³μκ° μ μ₯λλ μμμ΄κ³ , ν¨μ νΈμΆμ΄ μλ£λλ©΄ μ¬λΌμ§λ€. | μ½λ μμ | λ°μ΄ν° μμ | ν μμ | μ€ν μμ | | βββ | ββββ | βββββ | βββ | | μμ€ μ½λ | μ Όμ λ³μ | λμ ν λΉ λ³μ | μ§μ λ³μ | | | μ μ λ³μ | | λ§€κ° λ³μ |
μ°Έκ³ λ‘, HEAP
κ³Ό STACK
μμμ μ¬μ€ κ°μ 곡κ°μ 곡μ νλ€.
HEAP
μ΄ λ©λͺ¨λ¦¬ μμͺ½ μ£ΌμλΆν° ν λΉλλ©΄ STACK
μ μλμͺ½λΆν° ν λΉλλ μμ΄λ€. κ·Έλμ κ° μμμ΄ μλ 곡κ°μ μΉ¨λ²νλ μΌμ΄ λ°μν μ μλλ° μ΄λ₯Ό κ°κ° HEAP OVERFLOW
, STACK OVERFLOW
λΌκ³ μΉνλ€.
Stack
μμμ΄ ν¬λ©΄ ν΄ μλ‘ Heap
μμμ΄ μμμ§κ³ , Heap
μμμ΄ ν¬λ©΄ ν΄μλ‘ Stack
μμμ΄ μμμ§λ€.
βοΈ λ³μμ μ’ λ₯μ λ©λͺ¨λ¦¬ ν λΉ
:: μ μλ³μ(Global Variable)
- μ μλ³μλ νλ‘κ·Έλ¨μ μ΄λμλ μ κ·Ό κ°λ₯ν λ³μ
- νλ‘κ·Έλ¨μ μμκ³Ό λμμ λ©λͺ¨λ¦¬μ ν λΉλκ³
- νλ‘κ·Έλ¨μ ν¬κΈ°κ° 컀μ§μλ‘ μ μλ³μλ‘ μΈν΄ νλ‘κ·Έλ¨μ΄ 볡μ‘ν΄μ§ μ μλ€
- λ©λͺ¨λ¦¬μ λ°μ΄ν°(Data) μμμ μ μ¬λλ€
:: μ§μλ³μ(Local Variable)
- νλ‘κ·Έλ¨μ νΉμ ν λΈλ‘(block)/μ€μ½ν(scope)μμλ§ μ κ·Όν μ μλ λ³μ
- ν¨μκ° μ€νλ λλ§λ€ λ©λͺ¨λ¦¬μ ν λΉλμ΄ ν¨μκ° μ’ λ£λλ©΄ λ©λͺ¨λ¦¬μμ ν΄μ λλ€
- λ©λͺ¨λ¦¬μ μ€ν(Stack) μμμ κΈ°λ‘λλ€
:: μ μ λ³μ(Static Variable)
μ μλ³μμ μ§μλ³μμ νΉμ§μ λͺ¨λ κ°μ§κ³ μλ€
- νλ‘κ·Έλ¨μ νΉμ ν λΈλ‘(block)/μ€μ½ν(scope)μμλ§ μ κ·Όν μ μλ λ³μ
- νλ‘κ·Έλ¨μ΄ μ€νλ λ λ©λͺ¨λ¦¬μ ν λΉλμ΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λλ©΄ λ©λͺ¨λ¦¬μμ ν΄μ λλ€
- λ©λͺ¨λ¦¬μ λ°μ΄ν°(Data) μμμ κΈ°λ‘λλ€
#include <stdio.h>
void process() {
static int a = 5;
a = a + 1;
printf("%d\n", a);
}
int main(void) {
process(); // 6
process(); // 7
process(); // 8
system("pause");
return 0;
}
:: λ μ§μ€ν° λ³μ(Register Variable)
- λ©μΈ λ©λͺ¨λ¦¬ λμ CPUμ λ μ§μ€ν°λ₯Ό μ¬μ©νλ λ³μ
- λ©λͺ¨λ¦¬ 보λ€λ λ μ§μ€ν°κ° CPUμ λ κ°κΉκΈ° λλ¬Έμ μ²λ¦¬ μλκ° λΉ λ₯΄λ€
- μ¦, λ μ§μ€ν° λ³μλ₯Ό μ¬μ©νμ λ μλμ μΌλ‘ μ 리νλ€.
- λ€λ§, λ μ§μ€ν°λ λ§€μ° νμ λμ΄ μμΌλ―λ‘ μ€μ λ‘ (νμ) λ μ§μ€ν°μμ μ²λ¦¬λ μ§λ μ₯λ΄ν μ μλ€;;;
#include <stdio.h>
int main(void) {
register int a = 10, i;
for (i = 0; i < a; i++) {
printf("%d\n", a);
}
system("pause");
return 0;
}
:: ν¨μμ λ§€κ° λ³μκ° μ²λ¦¬λ λ
- ν¨μλ₯Ό νΈμΆν λ, ν¨μμ νμν λ°μ΄ν°λ₯Ό 맀κ°λ³μλ‘ μ λ¬
- μ λ¬ λ°©μμ
κ°μ μν μ λ¬ λ°©μ
κ³Όμ°Έμ‘°μ μν μ λ¬ λ°©μ
μ΄ μλ€κ°μ μν μ λ¬ λ°©μ
μ λ¨μ§ κ°μ μ λ¬νλ―λ‘ ν¨μ λ΄μμ λ³μκ° μλ‘κ² μμ±λλ€ β λΉμ νμλ©΄ μ§μλ³μμ κ°λ€μ°Έμ‘°μ μν μ λ¬ λ°©μ
μ μ£Όμλ₯Ό μ λ¬νλ―λ‘ μλμ λ³μ μ체μ μ κ·Όν μ μλ€ β λΉμ νμλ©΄ μ μλ³μμ κ°λ€
π κ°μ μν μ λ¬ λ°©μ(add ν¨μ) μμ
- add ν¨μλ‘ λ κ°μ κ°μ λ£μΌλ©΄ μλ‘κ² λ λ³μκ° λ©λͺ¨λ¦¬ λ΄μ ν λΉλμ΄ μ²λ¦¬
- λ°λΌμ μλ λ³μμ κ°μλ μν₯μ λ―ΈμΉμ§ λͺ»νλ€
#include <stdio.h>
void add(int a, int b) {
a = a + b;
// system("pause"); ν¨μ λ΄λΆμμ μΆλ ₯νλ€λ©΄ κ²°κ³Όκ°μ 17
}
int main(void) {
int a = 7;
add(a, 10);
printf("%d\n", a); // κ°μ μν μ λ¬ λ°©μμ μ¬μ©νμΌλ―λ‘ κ²°κ³Όκ°μ 7
system("pause");
return 0;
}
π μ°Έμ‘°μ μν μ λ¬ λ°©μ(add ν¨μ) μμ
- 맀κ°λ³μλ‘ κ°μ μ λ¬νλ κ²μ΄ μλ, λ³μμ μ£Όμ μ¦, πν¬μΈν° κ°μ μ λ¬
- μλ λ³μμ κ°μ μ κ·Όνμ¬ κ°μ λ³κ²½ν μ μλ€
#include <stdio.h>
void add(int *a) {
(*a) = (*a) + 10;
}
int main(void) {
int a = 7;
add(&a);
printf("%d\n", a); // 17
system("pause");
return 0;
}
π ν¬μΈν°(Pointer)λ?
ν¬μΈν°μ κ°λ
- ν¬μΈν°λ νΉμ ν λ³μ μμ²΄κ° μ‘΄μ¬νλ λ©λͺ¨λ¦¬μ μ£Όμμ κ°μ κ°μ§λ€
- λ¨μν μ£Όμκ°λ§ μ μ₯νλκ² μλ, μ΄λ€ μλ£νμΈμ§λ ν¬ν¨νμ¬ μ μ₯
- λ°λΌμ, κΈ°μ‘΄ aλ₯Ό μ΄μ©ν΄μλ 5λΌλ κ°μ μ°Ύμ μ μμ§λ§, ν¬μΈν° λ³μμΈ bλ₯Ό μ΄μ©ν΄μλ 5λΌλ κ°μ μ°Ύμ μ μλ€.
μ΄λ¦ | μ€λͺ |
---|---|
μ£Όμ μ°μ°μ(&) | λ³μ μμ λΆμ΄μ λ³μμ λ©λͺ¨λ¦¬ μμ μ£Όμ κ°μ κ΅¬ν¨ |
ν¬μΈν°(*) | ν¬μΈν° λ³μλ₯Ό μ μΈν λ μ¬μ© |
κ°μ μ°Έμ‘° μ°μ°μ(*) | μ μΈλ ν¬μΈν° λ³μκ° κ°λ¦¬ν€λ λ³μλ₯Ό κ΅¬ν¨ |
ν¬μΈν°μ κ°λ ₯ν κΈ°λ₯
- ν¬μΈν°λ μ»΄ν¨ν° μμ€ν μ νΉμ ν λ©λͺ¨λ¦¬μ λ°λ‘ μ κ·Όν μ μλ€
- λ°λΌμ κΈ°μ‘΄μ μ‘΄μ¬νλ μ€μν λ©λͺ¨λ¦¬ μμμ μ κ·Όνμ§ μλλ‘ ν΄μΌ νλ€
- μλμ μ½λλ κ΅μ₯ν μνν μ½λ μμμ΄λ€β¦ π±π±
int *a = 0x12345678;
*a = 0;
- λ€μ€ ν¬μΈν°μ κ°λ λ μλ€. μμ) ν¬μΈν°μ ν¬μΈν°
int *a = 5;
int *b = &a;
int **c = &b;
- λ°°μ΄κ³Ό ν¬μΈν°λ μ¬μ€ λ΄λ¬΄μ μΌλ‘ κ±°μ λμΌνλ€. λ°°μ΄μ μ μΈν μ΄νμλ κ·Έ μ΄λ¦ μ체λ₯Ό ν¬μΈν° λ³μμ²λΌ μ¬μ©ν μ μλ€.
β¨ tl;dr
- CμΈμ΄μμλ μ μλ³μ, μ§μλ³μ λ± λ€μν μ’ λ₯μ λ³μκ° μ¬μ©λλ€
- ν¨μμ λ°μ΄ν°λ₯Ό μ λ¬νλ λ°©λ²μ λ κ°μ§κ° μλλ°
κ°μ μ λ¬νλ λ°©λ²
κ³Όμ£Όμλ₯Ό μ λ¬νλ λ°©λ²
μ΄λ€
- ν¬μΈν°λ νΉμ ν λ³μκ° λ©λͺ¨λ¦¬ μμ μ‘΄μ¬νλ μμΉ μ£Όμλ₯Ό μ μ₯.
- νΉμ ν λ©λͺ¨λ¦¬ μ£Όμμ λ°λ‘ μ κ·Όν μ μμΌλ―λ‘ μ‘°μ¬μ€λ½κ² μ¬μ©νμ!!