2012-11-30 38 views
3

我正在閱讀the code for _start as packaged with FreeBSD,並對我所看到的某些特別好奇。第61行將char **投射到void *,然後立即變爲long *。我已經看過a similar StackOverflow question,但這裏不適用,因爲所有的指針都是相同的大小。誰能告訴我爲什麼這條線投了兩次而不是一次?在一行中應用兩個顯式指針強制轉換?

+2

在這種情況下,轉換爲'(void *)'是無用的。 –

+0

如果不是由GCC編譯,該文件將出錯,位於名爲「amd64」的目錄中,並且內嵌程序集。我不認爲引用標準的任何答案在這裏都是完全有意義的。在這個例子中,我也沒有看到爲什麼要拋出'void *'的原因。 – asveikau

回答

1
ISO c99 : 6.3.2.3 Pointers 

「的孔隙的指針可被轉換成或從一個指針到任何不完整的或對象 類型。一個指針,指向任何不完整的或對象類型可被轉換成一指向void 並返回,結果應與原始指針相等。「

「A指向對象的指針或不完整的類型可被轉換成一個指針到一個不同的 對象或不完整的類型。If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined,否則,再次轉換回時,所述 結果應比較等於原始指針當一個對象的指針轉換爲一個指向字符類型的指針時,結果指向該對象的最低尋址字節,結果的連續增量,直到對象的大小,產生指向剩餘對象的字節「。

第二段說,你可以將任何指針轉換爲一種類型爲其他類型,但如果結果指針未對齊,然後behaviour is undefined

雖然第一段沒有說關於undefined behaviour的任何事情。

所以我認爲將void *轉換爲任何類型比直接從一種類型轉換爲另一種更安全的方法。

因此,你看到相同。

編輯:我不認爲這是你的問題的確切答案,但至少你可以在上面提到的c99標準中看到相關的東西。

+1

沒有理由爲什麼首先投射到'void *'比在兩個不同類型的指針之間直接投射更安全。兩者都會導致未定義的行爲。只有在'void *'和原始指針類型之間進行轉換纔是明確的。是的,這意味着很多野外代碼依賴於未定義的行爲。 – rubenvb

相關問題