2011-08-26 107 views
3

我對類型轉換有疑問。這只是這裏顯示的一個虛擬程序。實際的代碼太大而無法發佈。關於類型轉換的問題

typedef struct abc 
{ 
    int a; 
}abc_t; 

main() 
{ 
    abc_t *MY_str; 
    char *p; 
    MY_str = (abc_t *)p; 
} 

每當我運行質量分析檢查工具,我得到一個2級警告:

Casting to different object pointer type. REFERENCE - ISO:C90-6.3.4 Cast Operators - Semantics <next> Msg(3:3305) Pointer cast to stricter alignment. <next> 

誰能告訴我如何解決這個問題?

+0

爲了「解決」這個問題,我們必須知道你的最終目標是什麼。如果沒有這些知識,告訴你不要將'char *'強制轉換爲'abc_t *'與任何其他分辨率一樣好。 –

+0

這個質量分析檢查工具的名稱是什麼? –

回答

2

簡單 - 你的靜態分析工具(?這,順便說一句)已決定,char*沒有一個特殊的對齊要求(它可以在存儲器中的任何點),而一個abc_t*可能有一個字對齊要求(int必須是一個4/8字節的邊界)。

實際上,由於char*位於堆棧上,因此它將在大多數架構上與字對齊。你的工具看不到這個。

+0

@ Yann ......你可以更清楚地說明一下,如果你不介意 – maddy

+1

char *本身的對齊並不重要,重要的是指針值的對齊。在示例代碼中我們沒有看到任何有關這方面的信息。如果它的初始化如下所示,那麼'p'的指針值的對齊方式是什麼:'p = strchr(some_string_var,'');' –

+2

你的「在現實中......」沒有任何依據。沒有理由期望編譯器將棧緩衝區對齊。 OP的代碼是無效的,應該使用'union',或者更好,只需要使用正確的類型開始,並且只在需要時才轉換爲'unsigned char *'。 –

1

在你的實現(也可能是許多其他的)每個int必須是整除的地址由sizeof int,這常常是4

在另一方面,char可以在任何地址。

這就像將3.25分配給int變量。這也是不可能的。

所以,當你有一個壞指針,你可能會從你的機器得到一個例外,這在技術上代碼調用未定義行爲

1

a char*可以在任何字節邊界上對齊,這意味着如果將其轉換爲結構,則該結構的對齊要求可能不會被滿足(例如SIMD類型需要16字節的邊界)。

1

你的代碼是無效的C.如果你發現自己在做這樣的事情,那可能是誤解的結果。例如,我猜你想要從文件/套接字/ etc中讀取abc_t對象。並且您習慣於將指針傳遞給read/recv /任何函數。相反,您應該聲明abc_t類型的對象,並將其地址傳遞給您正在使用的任何閱讀功能。