2015-07-21 133 views
1

我有一個源代碼,給出的錯誤「表達式必須有指針類型」錯誤「表達式必須有指針類型」何時發生?

這是遺留代碼,我沒有整個代碼。出現錯誤的代碼是:

(void *)&arr[0] 

我不知道arr的類型。

  1. 在什麼情況下會發生這種錯誤?
  2. 什麼類型的arr可能會導致此錯誤?

我知道數據較少,以確定問題,但我需要模擬它在較小的代碼。任何幫助將不勝感激。

+0

真正的祕密就是爲什麼這個代碼(大概)在同一時間工作。這個遺留代碼來自哪個環境?也許是在某個16位系統中,某人將未簽名的整數當作指針 - 儘管我認爲這會在編譯時給出警告而不是完全錯誤。 –

+1

「我不知道'arr'的類型......」 - 這怎麼可能?如果你有源代碼,你爲什麼不看看如何聲明'arr'並找出它的類型?這將立即清楚說明這裏發生了什麼。 – AnT

回答

0

如果「需要效仿在較小的代碼」,這裏是類型int導致此錯誤聲明的例子

int main() { 
    int arr; 
    (void *)&arr[0]; 
} 

可變arr。實際上,任何非數組非指針類型的arr都會導致此錯誤。

+0

謝謝,但這並不會產生確切的錯誤,說:「下標值既不是數組也不是指針」...對不起,但我需要確切的錯誤。 –

+0

@Anuj Priyadarshi:呃..你在用什麼編譯器? C沒有「確切的錯誤」。每個編譯器都以自己的方式報告錯誤。錯誤消息「下標值既不是數組也不是指針...」是GCC編譯器在這種情況下產生的。你原來的「表達式必須有指針類型」是*不是* GCC錯誤信息。嘗試使用*不同的編譯器重現錯誤消息的確切文本是沒有意義的。什麼編譯器生成原始消息?它實際上聽起來像MSVC錯誤信息。 – AnT

2

arr沒有指針或數組類型時會發生此錯誤。除數組或指針類型外,任何類型的arr都會導致此錯誤。 「

0

」我不知道arr的類型。「

那麼,你確實知道它不是什麼:一個指針。所以錯誤。

壞消息是:沒有進一步的信息,這是不可能解決的。

+0

@JAL:它回答了這個問題的兩個「部分」:1)實際上包含在2)中,我通過否定來回答,因爲它對於肯定的答案來說太寬泛了, – Olaf

0

爲了使表達arr[0]合法,arr必須是數組或指針類型。請記住,像[]這樣的後綴運算符比像&這樣的一元運算符具有更高的優先級,因此整個表達式解析爲(void *) (&(arr[0]));也就是說,我們將結果的地址作爲arr[0]並將其轉換爲void *

相關問題