2011-04-28 2 views
1

에 변수/기능 평가 I가 다음 코드, seg=b7ffd000은 GDB

... 
char* seg = mmap(0, ...) 
printf("seg=%x\n", seg); 
... 

프로그램 인쇄합니다. gdb (동일한 실행)에서 p/x seg을 사용할 때 $2 = 0x0을 인쇄합니다. 나는 여기서 혼란스러워한다. 그것은 같은 변하지 않습니까 seg? 왜 값이 다른가?

추신 : mmap에서 첫 번째 인수는 매핑 된 메모리의 주소이고 반환 값은 매핑 된 메모리의 실제 주소입니다.

+3

최적화 기능을 사용하여 컴파일 중입니까? –

+0

예, -O3을 제거하면 문제가 사라집니다. 이유에 관심이 있습니다. 최적화가 활성화 된 상태에서 메모리의 실제 주소가 어떤 값인지 ... – Richard

답변

3

의견에서 내 질문에 대한 답변을 얻었으니 이제 답변을 드리겠습니다.

printf의 결과로 표시되는 값은 실제 주소입니다. 최적화가 활성화되면 컴파일러는 모든 종류의 이상한 일들을 자유롭게 수행 할 수 있기 때문에 디버거에서 0seg의 값으로 표시됩니다 (일반적으로 단계별 디버깅이 까다 롭습니다). "관찰 가능한"동작은 항상 정확해야하지만 (정의되지 않은 동작에 의존하지 않는다고 가정).