我讀過將指向一個類型的指針指向另一個指向另一個類型的指針是非法的;例如,在本書中:指針轉換
C How To Program 7 ed。 PAG。 299
常見編程錯誤7.7 分配一個類型的指針 指針另一種類型的,如果兩者都不是類型爲void *的是一個語法錯誤 。
或在此URL:
但豪爾在C11標準被寫入:
一個指向對象類型可被轉換成一個指針指向一個不同 對象類型。如果生成的指針不正確 爲引用類型對齊,行爲是未定義的。 否則,當再次轉換時,結果應該等於 與原始指針。
所以我明白,只有在存在對齊問題的情況下,行爲纔是未定義的。
事實上,像GCC 4.8或CL 2013這樣的編譯器只會發出不兼容指針類型賦值的警告。
void指針不存在該異常。
所以:
int a = 10;
float b = 100.22f;
int *p_a = &a;
float *p_f = &b;
p_a = p_f; // NOT ILLEGAL but WARNING
p_f = p_a; // converted back again. it still works
void *v_p = p_a; // NOT ILLEGAL NO WARNING
p_a = v_p; // converted back again. it still works
我理解的呢?或者我錯過了什麼?
P.S. 也可以任何人給我看一個「對齊問題」的例子嗎?
也許你可以告訴我們這些「很多書」是什麼,他們實際上說了些什麼?你使用的是什麼版本的gcc,以及它給出了什麼樣的警告。並且告訴我們你在調整方面所做的研究,以及你不瞭解哪些部分。 – Useless 2014-09-02 12:06:36
@Useless,我不明白是否將指針指向指向另一個類型的指針的類型是LEGAL或NOT,與void *一樣。對於標準,它似乎明白它是合法的...... – xdevel2000 2014-09-02 12:23:41
如果本書說分配指向另一種不同類型的指針是「語法錯誤」,那麼這本書是錯誤的! – Jay 2014-09-02 13:04:58