2012-07-12 1 views
1

대상 플랫폼이 32 비트 일 때 Visual Studio 2005에서 완벽하게 컴파일되는 기존 코드가 있습니다. 그러나 64 비트에서는 작동하지 않습니다. 나는 왜 그런지 이해하지 못한다. 사실 포인터가 오래전에 캐스팅 된 것을 본 적이 없습니다. 심지어 올바른 C++인가?long * double * 저장 (C++)

#define REAL double 
typedef REAL* point; 
point *ptary; //(so it's basically double** ptary?) 
long arylen = (long) ptary[0]; 

미리 감사드립니다.

+3

언어의 측면에서 정확하지만 사람들이 캐스팅에 대해 경고하는 경우 이와 같은 이유 (정확하게 말해서)와 같은 이유, 즉 휴대 성의 부족 때문입니다. –

+0

'long'은 64 비트 Linux 및 다른 플랫폼에서 64 비트이므로, 코드를 Windows로 이식 할 때 나타나는 일반적인 오류입니다. – ecatmur

답변

7

포인터와 long이 모두 32 비트이기 때문에 32 비트 시스템에서 작동하는 것처럼 보입니다. 포인터는 64 비트 폭이기 때문에 64 비트 시스템에서는 작동하지 않지만 long은 (아마도) 단지 32 비트 폭입니다.

sizeof(double*)sizeof(long)을 인쇄하여 쉽게 확인할 수 있습니다. 내 생각 엔 출력은 각각 64 비트 시스템에서 8과 4가 될 것입니다.

포인터를 보유 할 수있는 정수 유형이 필요하면 <stdint.h>intptr_t을 사용하십시오.

+0

또한 포인터를 정수로 변환하거나 그 반대로 변환하는 것은 구현 정의 연산입니다. 일부 컴파일러/구현에서는 기대 한대로 작동하지만 다른 컴파일러에서는 기대하지 않을 수 있습니다. 'intptr_t'와'uintptr_t'는 옵션 타입입니다. – dreamlax