배경 :64 비트 포인터는 64 비트 컴퓨터에서만 하위 32 비트를 사용합니까?
나는 다음과 같은 간단한 코드를 가지고 : get_result()
은 (여기에 64 비트 시스템에서 64 핀터이어야 함)에 대한 포인터를 반환 뭔가
Object * copied_object = get_result(original_object);
. get_result() 함수를 선언하지 않으면, gcc는 기본적으로 함수의 int를 반환 할 것이므로 result
에는 잘린 포인터 (왼쪽 32 비트 만)가 포함될 것입니다.이 문제로 인해 sig11 오류가 발생했습니다.
그러나 내 프로그램을 실행하면 내 오류가 비결정적으로 나타나는 것 같습니다. 처음에는이 논리를 루프에 넣었고 명령 줄에서 신호를 보낼 때마다 위 코드가 실행될 것이고, 그래서 sig11이 내 프로그램을 크래시하지 않도록 시그널 핸들러를 가지고있다.) 디버깅 후 다음과 같은 시간에 함수에서 반환 된 포인터는 하위 32 비트 (심지어 original_object
같은 포인터도 아래 32 비트 사용) 만 사용한다는 것을 알게되었습니다. 따라서 잘라내 기가 아무런 문제를 일으키지 않았습니다.
질문 :
내 질문은 우리가 64 기계에 대한 포인터의 하위 32 비트를 사용합니까 어떤 조건입니까? 포인터를 할당하는 패턴은 무엇입니까?
도움이되었거나 참고 문헌을 매우 환영합니다.
나는 당신이 길을 나갔다 (올바른 프로 시저 선언을 생략함으로써) 포인터가 잘리는 이유를 알지 못한다. 그것의 좋은 것은 올 수 없다. – slipperyseal
감사합니다. 물론 코드에서 포인터 잘림을 남기지 않을 것입니다. 나는 매번 동일한 오류가 발생하지 않는 이유를 여기에서 이해하려고 노력하고 있지만, 단지 처음으로 - 안정적으로, 매회. – Lonely
한 가지 이유 : http://en.wikipedia.org/wiki/Address_space_layout_randomization – hyde