윤성우의 열혈 C 프로그래밍 - C언어의 메모리 구조 [25-1]

Yumin Jung·2023년 10월 20일
0
#include <stdio.h>

void func2(int n) {
	int num3 = n + 1;
}
void func1(int n) {
	int num2 = n + 1;
	func2(num2);
}
int main(void){
	int num1 = 20;
	func1(num1);
	return 0;
}

이 예제를 컴파일하고 실행하는 경우, 프로그램 시작부터 종료 시까지 스택의 상태변화에 대해서 설명해보겠다.

과정

일단 현재 전역변수 또는 static 지역변수는 없으니 데이터영역에는 할당되지 않는다.

  1. main 함수가 호출되어 지역변수 num1이 할당된다.

  2. func1 함수가 호출되어 n 매개변수가 20의 값으로 초기화되어 할당된다.

  3. func1 함수의 지역변수 num2이 21의 값으로 초기화되어 할당된다.

  4. func2 함수가 호출되어 n 매개변수가 21의 값으로 초기화되어 할당된다.

  5. func2 함수가 호출되어 num3이 22의 값으로 초기화되어 할당된다.

  6. [func2 함수의 매개변수 n과 지역변수 num3 소멸]

  7. [func1 함수의 매개변수 n과 지역변수 num2 소멸]

  8. [main 함수의 지역변수 소멸]

  9. [return 0에 의한 프로그램 종료]

결론

할당 순서 main -> func1 -> func2
소멸 순서 func2 -> func1 -> main

먼저 호출된 함수의 스택공간일수록 늦게 해제된다는 것을 알 수 있다.

내가 헷갈렸다가 깨우친 것

ex) f1 함수 내에서 f2 함수가 호출될 때는 f1 함수가 반환이 되고 f2 함수가 호출되는게 아니다. 위의 결론과 같이 스택공간에 쌓인다.

profile
문과를 정말로 존중해

0개의 댓글