2012-03-06 8 views
2

下のコードでは、印刷頂点を呼び出すときに明らかな理由がないため、EXC_BAD_ACCESSエラーが発生しています。ポインタはまったく同じ場所を指していますが、vp2を渡すと何とかクラッシュします。intをキャストした後にEXC_BAD_ACCESSを取得するのはなぜですか?

#include <stdio.h> 

typedef struct { 
    float x; 
    float y; 
    float z; 
} Vertex; 

void printVertex(Vertex *v); 

int main (int argc, const char * argv[]) 
{ 
    Vertex v = {1,0,2}; 
    int memL = (int)&v; 
    Vertex *vp = &v; 

    printf("Memory Location: %i\n", memL); 
    printf("Memory Pointed to by Pointer: %i\n", (int)vp); 

    Vertex *vp2 = (Vertex *)memL; 
    printf("Memory Pointed to by Pointer from memory location: %i\n", (int)vp2); 

    printVertex(vp); // Executes normally 
    printVertex(vp2); // EXC_BAD_ACCESS 

    return 0; 
} 

void printVertex(Vertex *v) 
{ 
    printf("Vertex[%f,%f,%f]\n", v->x, v->y, v->z); // EXC_BAD_ACCESS when vp2 passed in 
} 

出力:

Memory Location: 1606416816 
Memory Pointed to by Pointer: 1606416816 
Memory Pointed to by Pointer from memory location: 1606416816 
Vertex[1.000000,0.000000,2.000000] 
EXC_BAD_ACCESS Error 
+1

'%p'を使用して、' intptr_t'のポインタ –

答えて

2
int memL = (int)&v; 

vのadddressを切り捨てる場合がございます。試してみることができます:

intptr_t memL = (intptr_t)&v; 

切り捨てが問題である場合、これはクラッシュすべきではありません。

+1

+1を出力する方が良いでしょう。切り捨てはOPの問題です。 –

1

ポインターは64ビット幅ですが、intタイプのポインターは32ビットです。あなたはポインタ情報の半分を捨てている!

+0

これは違いはありません。なぜなら、printステートメントでわかるように、場所は同じなので、ポインタに戻すと64ビットになります。 –

+1

いいえ - あなたは今までに32ビットの数字を印刷しています!どのような場合でも 'int'または' int'にキャストされたものを印刷しています。クレイジーな型キャストをしなくても、これらのポインタの1つを印刷してみてください。次のようなものがあります: 'printf("%p \ n "、vp);'あなたは何が起きているのかを見るでしょう。 –

+0

私はおそらく私の答えで「おそらく」それを編集しました。それは「可能性」ではないからです。*まさに*起こっていることです。 –

関連する問題