2012-03-06 19 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的指針 – 2012-03-06 01:29:35

回答

2
int memL = (int)&v; 

可能被截去的v的地址經過。你可以嘗試:

intptr_t memL = (intptr_t)&v; 

看看是否是這種情況。如果截斷是一個問題,這應該不會崩潰。

+1

+1會更好。截斷是OP的問題。 – 2012-03-06 01:29:13

1

你的指針是64位寬,但你的int類型只有32位寬。你扔掉了一半的指針信息!

+0

這應該沒有什麼不同,因爲您可以通過打印語句來判斷,位置是相同的,所以當我將它轉換回指針時,它將再次變爲64位。 – 2012-03-06 01:25:14

+1

不 - 您只能打印32位數字!在任何情況下,你要麼打印一個'int'或者輸出'int'。嘗試打印其中一個指針,而不進行瘋狂的類型轉換。例如:'printf(「%p \ n」,vp);'你會看到當時的情況。 – 2012-03-06 01:26:59

+0

我編輯了「可能」在我的答案,因爲它不是「很可能」,它*完全*發生了什麼。 – 2012-03-06 01:28:25

相關問題