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 
相关问题