해결된 질문
작성
·
318
·
수정됨
0
우선 강의 내용 정말 만족하면서 잘 듣고 있습니다.
섹션 16의 "가변 길이 입력에 대한 stack frame 손상" 강의편에서
Callee로 GetString 함수를 활용하여 디버깅 모드로 메모리 주소를
추적하는 과정에서 질문드려요.
스택 구조는 높은 메모리 주소에서 낮은 메모리 주소 방향으로
할당 받는 구조로 알고 있는데, char 배열이 int형 변수보다
낮은 메모리 주소에 할당이 되어서 질문 드립니다.
제가 따로 여러 변수들을 적용하여 디버깅 해보았는데도 마찬가지더라고요.
혹시, os에 따라 변수가 할당되는 스택 메모리의 순서가 다른건지 궁금해서 질문드려요.
답변 2
1
인프런 AI 인턴이 알려준 것이 제가 드릴 답변입니다. 그리고 조금 더 내용을 추가 해야 할 것 같네요.
우선 기존 답변은 다음과 같습니다.
디스어셈블 코드는 디스어셈블러에 따라 조금씩 다르게 표기 될 수 있습니다. 그러나 지금 질문에서는 신경쓸 주제는 아닌 것 같습니다. 지역변수는 보통 선언한 순서대로 스택에 Push되는 것이 항상 옳은 것은 아닙니다. 일반적인 컴파일러 언어들은 최소 2회 이상 컴파일을 하는데 첫 번째 단계에서 지역변수 목록을 확보하고 소요될 Stack의 량을 계산합니다. 이 때 선언된 순서에 따라 스택 메모리 위치를 지역변수 + 자동변수에게 배치 할 수도 있고 아닐 수도 있습니다. 보통은 선언된 순서대로 스택에 Push되거나 아니면 선언된 순서의 역순으로 Push되는경향이 있습니다.
그리고 소모되는 스택 메모리의 크기는 보통 지역변수의 크기보다 더 큰 값이 할당 됩니다. 메모리 패킹 때문입니다. 이는 구조체 멤버 정렬과 비슷한 원리 입니다.
끝으로 지역변수로 인식되는 함수의 매개변수는 또 다릅니다. 무엇보다 64비트 환경에서는 fastcall 호출 규약이 늘 적용된다고 볼 수 있습니다. 해서 아예 스택에 메모리 공간이 표시되지 않을 수 있습니다.
참고하시기 바랍니다. :)
추가로 알아야 할 부분은 이러한 구조에 영향을 주는 것에 관한 것입니다. 간단히 정리하면 다음 두 가지 입니다.
컴파일러
컴파일러 설정 (특히 CPU 관련 설정 우리 수업에는 대표적으로 x86(32bit), x64(64bit))
같은 C언어 코드라 하더라도 CPU, OS 및 bit수에 따라 기계어 번역 결과가 많이 달라집니다. 특히 x64가 보편적인 지금의 상황에서는 기존 32bit 체계 기반 설명들이 맞지 않는 경우가 대부분입니다. 안타깝지만 둘 다 공부하는 것 외에 따른 방법은 없는 상황입니다.
디버깅도 열심히 하는 좋은 학습방법을 택한만큼 좋은 학습성과를 기대 할 수 있겠습니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
변수들이 스택 프레임에 할당되는 구조에 대해 궁금해 하시는군요. 이에 대한 답변으로 다음 게시글을 참고하시면 좋을 것 같습니다.
위의 게시글에서는 지역변수가 스택에 할당되는 순서와 관련된 질문에 대한 강사의 답변이 있습니다. 스택에 변수가 할당되는 순서에 대한 귀하의 질문에 도움이 될 것입니다.
이 게시글에서도 스택 프레임과 로컬 변수의 주소 배치에 대한 강사의 답변이 있어 도움이 될 것입니다.
강의를 잘 듣고 계신다니 다행이네요. 추가적으로 궁금하신 사항은 위 링크를 통해 강사의 답변을 확인해 보시기 바랍니다.