我有一個源代碼,給出的錯誤「表達式必須有指針類型」錯誤「表達式必須有指針類型」何時發生?
這是遺留代碼,我沒有整個代碼。出現錯誤的代碼是:
(void *)&arr[0]
我不知道arr
的類型。
- 在什麼情況下會發生這種錯誤?
- 什麼類型的
arr
可能會導致此錯誤?
我知道數據較少,以確定問題,但我需要模擬它在較小的代碼。任何幫助將不勝感激。
我有一個源代碼,給出的錯誤「表達式必須有指針類型」錯誤「表達式必須有指針類型」何時發生?
這是遺留代碼,我沒有整個代碼。出現錯誤的代碼是:
(void *)&arr[0]
我不知道arr
的類型。
arr
可能會導致此錯誤?我知道數據較少,以確定問題,但我需要模擬它在較小的代碼。任何幫助將不勝感激。
如果「需要效仿在較小的代碼」,這裏是類型int
導致此錯誤聲明的例子
int main() {
int arr;
(void *)&arr[0];
}
可變arr
。實際上,任何非數組非指針類型的arr
都會導致此錯誤。
謝謝,但這並不會產生確切的錯誤,說:「下標值既不是數組也不是指針」...對不起,但我需要確切的錯誤。 –
@Anuj Priyadarshi:呃..你在用什麼編譯器? C沒有「確切的錯誤」。每個編譯器都以自己的方式報告錯誤。錯誤消息「下標值既不是數組也不是指針...」是GCC編譯器在這種情況下產生的。你原來的「表達式必須有指針類型」是*不是* GCC錯誤信息。嘗試使用*不同的編譯器重現錯誤消息的確切文本是沒有意義的。什麼編譯器生成原始消息?它實際上聽起來像MSVC錯誤信息。 – AnT
當arr
沒有指針或數組類型時會發生此錯誤。除數組或指針類型外,任何類型的arr
都會導致此錯誤。 「
」我不知道arr
的類型。「
那麼,你確實知道它不是什麼:一個指針。所以錯誤。
壞消息是:沒有進一步的信息,這是不可能解決的。
@JAL:它回答了這個問題的兩個「部分」:1)實際上包含在2)中,我通過否定來回答,因爲它對於肯定的答案來說太寬泛了, – Olaf
爲了使表達arr[0]
合法,arr
必須是數組或指針類型。請記住,像[]
這樣的後綴運算符比像&
這樣的一元運算符具有更高的優先級,因此整個表達式解析爲(void *) (&(arr[0]))
;也就是說,我們將結果的地址作爲arr[0]
並將其轉換爲void *
。
真正的祕密就是爲什麼這個代碼(大概)在同一時間工作。這個遺留代碼來自哪個環境?也許是在某個16位系統中,某人將未簽名的整數當作指針 - 儘管我認爲這會在編譯時給出警告而不是完全錯誤。 –
「我不知道'arr'的類型......」 - 這怎麼可能?如果你有源代碼,你爲什麼不看看如何聲明'arr'並找出它的類型?這將立即清楚說明這裏發生了什麼。 – AnT