此代码:
int p = 10;
void *q;
*q = 10;
不编译:
'=':无法从'int'转换为'void *'
但是,这段代码编译得很好:
int p = 10;
void *q;
q = &p;
背后的原因是什么?
答案 0 :(得分:5)
A void *
指向未知类型的数据(如果已初始化,则不是您的数据)。
您只能分配已知类型的变量,或通过已知类型的指针。
int p = 10;
void *q = &p;
*(int *)q = 20;
if (p != 20)
...something has gone horribly wrong...
这会将void *
转换为int *
,然后为该解除引用的整数指针赋值。
答案 1 :(得分:4)
任何指针都可以转换为void*
,但取消引用指向void
的指针是违法的。
答案 2 :(得分:1)
第一个片段是未定义的行为。
答案 3 :(得分:1)
这两段代码(尝试)做了不同的事情。
第一个尝试将值10分配给对象q
指向。这里有两个问题。首先,你从未初始化指针。在更改指向的值之前,您需要将其指向某个位置。第二,你不能解除引用void*
,因为类型是未知的。
第二段代码是将变量p
的地址分配给q
。在此q
将指向存储在p
。
答案 4 :(得分:1)
这会将内存q
中的地址更改为:
q = &p;
这无法确定q
指向的内容的类型(int
,long
,std::string
,int**
等等;所有它知道的是内存中的位置:
*q = 10;
你可以这样做:
int *iq = static_cast<int*>(q);
*iq = 10;
您可能想要了解有关void*
s的更多信息。
答案 5 :(得分:0)
您无法取消引用void指针。即使你可以,你的代码也会写入一些随机内存地址并可能崩溃。
在第二个代码块中,您正在分配指针的地址,该指针工作正常,因为您可以将任何内存地址分配给void*