20140324 (전역변수, 메모리 구조, 재귀함수)
26일차
--------------------
전 역 변 수
--------------------
- 지역변수와 다르게 어디서든 읽기 쓰기가 가능한 변수.
- 어떤 함수에서 쓰기 가능하기 위해 컴파일러가 제일 먼저 읽어야 하니
맨(include 밑에) 위에 선언한다.
- 기본적으로 0으로 초기화 돼있음.
- 변수가 만들어 지는 때
지역변수 : Run Time
전역변수 : Compile Time
- 지역변수는 Load 하면서 Mem에 할당됨.
- 전역변수는 컴파일당시에 생성되기 때문에 실행파일에 할당되어 있음.
ex) 예제 소스
#include <stdio.h>
void Add(int iVal);
int iNum;
int iNum1 = 10;
int iNum2;
int iNum3 = 20;
int iNum4;
int iNum5 = 30;
int iNum6;
int iNum7 = 40;
int main()
{
printf("iNum : 0x%08X \n", &iNum);
printf("iNum1 : 0x%08X \n", &iNum1);
printf("iNum2 : 0x%08X \n", &iNum2);
printf("iNum3 : 0x%08X \n", &iNum3);
printf("iNum4 : 0x%08X \n", &iNum4);
printf("iNum5 : 0x%08X \n", &iNum5);
printf("iNum6 : 0x%08X \n", &iNum6);
printf("iNum7 : 0x%08X \n", &iNum7);
printf("Add : 0x%08X \n", Add);
printf("main : 0x%08X \n", main);
printf("printf : 0x%08X \n", printf);
printf("iNum : %d \n", iNum);
Add(3);
printf("iNum : %d \n", iNum);
++iNum;
printf("iNum : %d \n", iNum);
printf("문자열 주소 : 0x%08X \n", "Welcome");
return 0;
}
void Add(int iVal)
{
if(0 == iNum)
{
printf("iVal : 0x%08X \n", &iVal);
}
iNum = iNum + iVal;
}
출력 화면
위에서 보았듯이 전역변수로 선언되 있는 변수는
main에서도 Add에서도 접근이 가능하다.
자세히 볼게 전역변수들을 관찰해 보면
초기화된 변수와 초기화 안된 변수의 주소값이 몰려 있는게
다르다.
초기화된 변수는 함수들의 주소값에 더 가깝다.
또 상수의 주소도도 초기화된 변수들의 주소와 가깝다.
-----------------
재 귀 함 수
-----------------
- 자신을 다시 부르는 함수
- 사용을 비추천
ex) 예제 소스
#include <stdio.h>
void Recursive(int iNum);
int main()
{
Recursive(3);
return 0;
}
void Recursive(int iNum)
{
if(0 >= iNum)
{
return;
}
printf("Recursive call!! %d \n", iNum);
Recursive(iNum - 1);
}
출력 화면