2017-06-02 82 views
3

我無法找到如何從下面的代碼行中刪除上述警告。數據是void指針,並且作爲回調函數的一部分將在數據指針中接收字符串。由於我已經指定了void指針,但編譯器仍然顯示警告。關於取消引用'void *'指針

基本上有兩個警告顯示在下面的行。 1.取消引用 '無效*' 指針 2.取型的表達的地址「無效

service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ; 

下面是所需的信息

void * data; 
AT_PARSER_RESPONSE at_response; 

typedef struct 
{ 

/*Other parameters */ 

AT_PARAM param[AT_MAX_NUM_PARAM]; 

}AT_PARSER_RESPONSE 
+1

請顯示'data','at_response'以及'at_response.param [0]'類型的定義。 – aschepler

+0

我在想(仍然是我的第一杯咖啡),優先順序不是你對'(const char *)&data [at_response.param [0] .start_of_value_index]'的想法(即你可能需要額外的括號),或者在使用'[]'之前需要將'data'強制轉換爲有效的類型,具體取決於'data' *的真實性。 – crashmstr

回答

5

引用C11,章§6.5.3.2

一元運算符*運算符表示間接。如果操作數指向一個函數,那麼結果是一個函數指示符 ;如果它指向一個對象,則結果是一個指定 對象的左值。如果操作數的類型爲''指向類型'',則結果的類型爲''type''。 如果 無效值已分配給指針,則一元運算符*的行爲未定義爲 。

所以,你的代碼將導致undefined behavior

此外,相關的,由第§6.2.5

void類型包括一個空的一組值; 這是一個不完整的對象類型, 無法完成。

所以,一個指向void用於取消引用無效的操作數。


一個可能實際情況和可能的解決方案

有時,用於製造泛型,我們投一定指針void *,傳遞作爲參數的函數,然後,我們投在函數內部它基於一些已知信息回到原始類型。按照第6.3.2.3章的規定,這是完全有效的情況。

指向 的指針任何對象類型都可能被轉換爲void指針並返回;結果應該等於原始指針 。

如果您遇到這種情況,而你在函數內部提領,您可以將指針轉換要麼

提領之前。

+0

可以請你添加你引用的鏈接嗎? – CIsForCookies

+1

@CIsForCookies就像我剛纔提到的那樣,它是來自C11標準的,實際銷售量很大,但你可以在線獲得一些相當準確的草稿版本。 :) –

+1

*然而,您可以在解除引用之前將指針轉換爲有效類型。*這也可以是未定義的行爲,因爲它可以[違反嚴格的別名](https://stackoverflow.com/questions/98650/what-is例如,如果你以'char *'開始,將它分配給一個'void *',然後將它轉換爲'double *'並嘗試對其進行解引用。 –