2012-06-07 30 views
1

我想知道是否可以通過工會地址訪問工會的實際成員,而不是通過運營商訪問工會的實際成員。如果這是可行的,那是允許的嗎?通過地址訪問工會的實際成員

+0

肯定的是,它只是一個內存位置......但工會符號告訴編譯器如何對待你所訪問的數據。考慮一個用'float'覆蓋一些'char'類型的聯合 - 你訪問的內存地址的數據類型是什麼? –

+0

指向結構的指針 – nEAnnam

回答

2

可以使用addressof操作進入聯盟的內存&(union)

例如

union foo { 
    int32_t bar; 
    int64_t baz; 
} afoo; 

void * address = &afoo; 

但是聯盟的要點是允許透明訪問由不同類型組成的數據的「共享」區域;如果你想要char *訪問數據,那麼你可以使用char *成員,並以這種方式訪問​​數據。

假裝的*地址是不同的類型,我們可以使用:

int64_t *abar = (int64_t*)address; 
printf("%llu\n", *abar); 
+0

'afoo.bar = 1000; union foo * address = &afoo; printf(「%i」,(* address).bar);'有沒有''>''''操作符訪問什麼點地址的方法? – nEAnnam

+0

添加了對答案的類型僞裝。你只需投下指針。 – Petesh

+0

非常嚴格地說,從指向union的指針到指向int64_t的未定義行爲,儘管我相信代碼將在所有已知編譯器上確定性地行爲。請記住,編譯器可以自由地在聯合中的任何位置添加填充字節,除非它在開頭。 – Lundin