0

這裏是我的代碼:在C++中,我得到一個消息「錯誤:‘無效*’不是一個指針到對象類型」

#include <iostream> 
using namespace std; 

int main() 
{ 
    void *x; 
    int arr[10]; 
    x = arr; 
    *x = 23; //This is where I get the error 
} 

正如你所看到的,代碼很簡單。它只是創建一個void指針x,指向數組'arr'的內存地址並將整數23放入該內存地址。但是當我編譯它時,我得到錯誤消息「'void *'不是指向對象的類型」。當我使用'int'指針而不是void指針並編譯它時,我不會收到任何錯誤或警告。我想知道爲什麼我會得到這個錯誤。

謝謝。

+1

出於同樣的原因,'空隙ÿ; y = 32;'不編譯:編譯器不知道如何將某些東西存儲到不完整類型'void'中。如果「x」指向「短」或「長」,該怎麼辦? – 2015-02-11 17:21:36

+0

這也取決於你的編譯器。 int * x = 42; LLVM會產生錯誤。 – chrizke 2015-02-11 17:32:13

+0

@chrizke你的代碼如何與這個問題相關? – Slava 2015-02-11 17:42:46

回答

8

正如編譯器消息所述,void*不是指向對象類型的指針。這意味着你不能做任何東西void*,除了顯式轉換回另一種指針類型。 A void*代表一個地址,但它沒有指定它指向的東西的類型,因此你不能對它進行操作。

+0

稍微限制一個對象或NULL的地址,而不是函數的地址。 – Deduplicator 2015-02-11 17:26:17

+0

@Deduplicator:或者一個函數,如果編譯器允許有條件支持的轉換。 – 2015-02-11 17:45:01

0

編譯器需要變量的類型來取消引用指針。

only example no malloc: * int myPtnr = 0x12345;

當你寫

* myPtr = NUM​​BER:

編譯器看的類型和說..還好我們這裏有一個INT ...我需要的信息是在接下來的4個字節開始與指針的地址。

這就是爲什麼你必須告訴編譯器的類型。當你使用void時,編譯器不知道他有多少字節需要用於解引用。

0

你無法解釋void *,這就是編碼器正在做的事情。

*x = 23; // this cant be done with void* 

代替:

x = &arr[index] ; // this is correct 
相關問題