[App 개발] xcode 쓰면서 주소값 출력때문에 질문 드립니다.
본문
요즘 C공부를 XCODE로 한참 재미있게하는데 질문이 있어서 올립니다.
재가 보는책이 MS(윈도우&컴파일러) 기준으로 쓰여진 책인데
메모리 주소값을 출력할때
int main(void)
{
int a;
a=10;
printf("%d", &a);
return 0;
}
게하면 음수값으로 출력되네요 윈도우에서 VC++이용해서 하면 양수로 잘나오는데 음수로 나와서 어떻게 해야 양수로
나오는지 알려주시면 감사하겠습니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 4
hongjuny님의 댓글
그것은 변수 a 라는 값을 저장하는 장소가 스택에 설정되었는데, 그 주소가 0x80000000 보다 큰 값이기 때문에, signed int 로 변환하는 과정에서 음수로 나온 것이지요. 스택 포인터가 그리 된 것을, 이 값을 일부러 양수로 만들어야 할 필요가 있을까요?
정 이 값을 양수로 만들어 주시고 싶으시면, 변수 a 를 static 으로 선언해 보세요. 항상 그런 것은 아닙니다만, heap 의 경우는 아마도 값이 작을 겁니다.
최정우님의 댓글
우선 답변 감사드립니다~
값이 초과해서 음수로 나왔군요 어쩐지 데이터 사이의 메모리 값의 차이는 일치한다 했더니. 그럼 컴파일러의 차이가 아니고 운영체제의 차이로 인해 발생하는 건가요? 그러니까 윈도우랑 OSX 는 메모리사에 스택 설정 위치가 다른가요? 답변해주시면 갑사하겠습니다. 재가너무 초보인지라;;
(요즘 어셈블리랑 컴퓨터 시스템을 배우는데 알것 같기도 하고 모를것 같기도 하고^^;)
hongjuny님의 댓글
네. OS 를 설계할 때, 개별 어플리케이션이 어떤 메모리 구조를 가지고 실행하느냐 하는 것을 결정하게 되는데, 여기서 각각의 세그먼트 위치가 결정됩니다. 컴파일러와 링커는 위의 세그먼트 정보를 바탕으로 코드와 데이터를 나열하여 전체 프로그램을 구성하게 되며, 디스크에서 프로그램을 읽어들이는 로더는 소프트웨어를 메모리 맵 구성에 맞게 읽어들여 배치함으로써 실행을 준비하게 되는 것이지요. 같은 x86 어셈블리로 컴파일된 프로그램이라고 해서 Win32 와 Mac OS X 프로그램이 동일하게 실행될 수 없는 여러 가지 이유 중의 하나가 바로 이러한 메모리 맵이 상이하기 때문입니다.
32bit 어플리케이션을 기준으로 해서
Win32 의 경우 기본적으로 스택 포인터는 0x0012FF80 부터 시작합니다. 마이크로프로세서 설계에 따라 달라집니다만, x86 프로세서의 스택은 위에서 아래로 커지게 되어 있지요. 그래서 변수를 하나 하나 선언할 때마다 스택 포인터 ESP 레지스터의 값은 내려가게 됩니다.
Mac OS X 은 0xC0000000 으로부터 점차 내려가게 됩니다. 그래서 위의 프로그램에서는 음수가 출력된 것이지요.
최정우님의 댓글
답변 정말 감사합니다^^
몇일전부터 궁금해서 이곳저곳 뒤져봤는데 속시원한 대답이 없어서 그러려니
하고 쓰다가 오늘 속이 확풀리네요~~