함수와 스코프: 값 복사, 수명, 재귀
함수 인자는 복사되어 전달됩니다. 지역 변수와 전역 변수의 수명, 그리고 MCU에서 재귀를 피하는 이유.
값에 의한 전달
C 함수는 인자의 복사본을 받습니다. 함수 안에서 인자를 바꿔도 호출한 쪽 변수는 그대로입니다. 바깥 값을 바꾸고 싶다면 주소를 넘깁니다. 이것이 포인터를 배워야 하는 첫 번째 이유입니다.
변수의 수명
| 종류 | 어디에 | 언제까지 |
|---|---|---|
| 지역 변수 | 스택 | 함수가 끝나면 사라짐 |
| 전역 변수 | .data / .bss | 프로그램 끝까지 |
| static 지역 변수 | .data / .bss | 프로그램 끝까지, 이름은 함수 안에서만 |
지역 변수의 주소를 반환하면 함수가 끝난 뒤 그 메모리는 다른 함수가 덮어씁니다. 컴파일은 되지만 가장 찾기 어려운 버그 중 하나입니다.
재귀를 피하는 이유
함수를 부를 때마다 스택이 쌓입니다. RAM이 수 KB인 MCU에서 깊이를 예측할 수 없는 재귀는 스택 넘침으로 이어지고, 증상은 엉뚱한 변수 값이나 하드폴트로 나타납니다. 임베디드 코딩 규칙 대부분이 재귀를 금지합니다.