인프런 커뮤니티 질문&답변

taehyun0222님의 프로필 이미지
taehyun0222

작성한 질문수

독하게 시작하는 C 프로그래밍

중첩 스코프와 식별자 검색 순서

같은 식별자 메모리 저장 위치

해결된 질문

작성

·

41

0

중첩스코프와 식별자 검색 순서 강의의 예제에 중단점 설정하고 nInput들의 메모리 저장위치들을 살펴봤는데, 15를 입력값으로 받았을때 두번째 nInput의 저장위치가

첫번째 nInput 저장위치랑 32바이트씩 일정하게 차이가 나던데 어떤 이유에서인가요 ? (두번째 변수엔 19 저장되게 했습니다)

화면 캡처 2024-10-15 151240.png

 

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

디버그 모드로 빌드 할 경우 각 지역변수 사이에 일정 수준의 공간이 추가로 들어가는데 이는 캐너리 비트입니다. 지역변수의 경계를 넘어선 입/출력이 일어나는 것을 탐지하기 위한 것입니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.
taehyun0222님의 질문에 대해 답변 드리겠습니다.

중첩 스코프와 식별자 검색 순서 강의에서 사용된 예제 코드에서, nInput 변수의 메모리 위치 차이를 관찰하신 부분은 매우 흥미로운 주제입니다. C 언어에서 변수는 보통 스택 메모리에 저장되며, 함수 호출이나 블록이 중첩되면서 각 변수들은 서로 다른 메모리 공간에 할당됩니다. 이런 배치는 컴파일러가 자동으로 수행하며, 이들이 메모리상에서 어떻게 배치될지는 컴파일러와 사용된 최적화 옵션에 따라 차이가 날 수 있습니다.

관찰하신대로 동일한 이름의 변수(nInput)가 다른 메모리 위치에 저장되는 것은 스코프와 연관이 있습니다. 여기서 스코프란, 특정 변수가 유효한 코드 영역을 의미합니다. 두 변수는 같은 이름을 가지고 있지만, 서로 다른 블록에 존재하므로 컴파일러는 이를 분리하여 메모리에 배치하게 됩니다.

32바이트씩 차이가 나는 이유는 컴파일러가 스택에 변수를 할당할 때 각 변수 및 추가적인 데이터를 저장하기 위해서, 예를 들어, 함수 호출 시의 리턴 주소나 이전 함수의 스택 프레임 포인터 등이 포함될 수 있습니다. 또한, 메모리 패딩을 적용하여 정렬을 맞출 수도 있습니다. 이는 아키텍처에 따라 최적화되며, 빠른 액세스를 보장하기 위한 전략입니다.

관련된 답변 및 설명은 정수형태 변수 메모리상 확인방법 및 단순 대입 관련 문의 에서도 확인하실 수 있습니다. 이 링크에서는 메모리를 다루는 일반적인 컴파일러 동작 및 주소 할당에 대한 개념을 조금 더 상세하게 다루고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

taehyun0222님의 프로필 이미지
taehyun0222

작성한 질문수

질문하기