전역변수 vs 지역변수 vs 정적변수
20일 미션 : 지역변수, 전역변수, 생성자, 파라미터에 대해 확실히 깨닫기 ^o^..
전역변수 : 중괄호 바깥에 선언되어 main 단이든 함수 단이든 어디든지 쓸수 있다. 초기값 없으면 기본적으로 0 (int 기준), 프로그램이 실행되고 있는 한 메모리에 계속 남아있다.
지역변수 : 중괄호 안에 선언된 변수. 중괄호를 벗어나면 메모리에서 소멸됨.
정적변수 : 전역변수와 지역변수의 특성을 다 가짐 // 전역변수 : 프로그램이 종료될때까지 메모리 상에 유지 + 지역변수 : 함수 내부에서만 사용 가능
int a=1, b=2, c=3;
int f(void){
int b,c;
a=b=c=4;
return(a+b+c);
}
int main(void){
printf("%3d\n", f());
printf("%3d%3d%3d \n", a,b,c);
return 0;
}
1. 전역변수 a, b, c가 생성됨 / a:1 , b:2, c:3
2. 3째줄에서 지역변수 b, c 가 생성됨
3. a=b=c=4 / a, b, c 모두에 4값을 넣으려한다. 함수 f에서 실행중이기 때문에 전역변수 값들보다 바뀐 값이 가깝다. a는 지역변수에는 존재하지않지만 전역변수에 있기 때문에 a값도 4로 변함.
4. return시 a는 전역변수 값의 a를 가져옴. b와 c는 가까운 지역변수를 참조함. (중괄호 안이 우선이다.) -> 4+4+4 = 12
5. printf("%3d\n", f()); 의 값은 12이다.
6. printf("%3d%3d%3d \n", a,b,c); -> f 함수를 빠져나오며 기존의 변수값은 지워진다. 다만 a는 전역변수이므로 바뀐채로 남아있다. 4 2(전역변수b) 3(전역변수c) 이 출력된다.
b가 static이라고 가정해본다.
그래도 4 2 3이 출력될것이다. 정적변수 또한 메모리 상에 남아있기는 하지만 f 함수 안에서만 사용가능하기 때문에 main에서 참조할 수 있는건 전역변수 b 이다.
https://youtu.be/MT5FUBvI1rk?si=mMVYW-oBh9jHOoh_