我有一个指向内存地址的void
指针。那我做
int
指针= void
指针float
指针= void
指针然后,取消引用它们就可以获取值。
{
int x = 25;
void *p = &x;
int *pi = p;
float *pf = p;
double *pd = p;
printf("x: n%d\n", x);
printf("*p: %d\n", *(int *)p);
printf("*pi: %d\n", *pi);
printf("*pf: %f\n", *pf);
printf("*pd: %f\n", *pd);
return 0;
}
解引用
pi
(int
指针)的输出为25。但是,取消引用
pf
(float
指针)的输出为0.000。取消引用
pd
(double
指针)也会输出负分数,该分数保持变化?
为什么会这样,并且与字节序有关(我的CPU是小字节序)?
最佳答案
根据C
标准,您允许将任何指针转换为void *
并将其转换回,其效果相同。
要引用C11
,请参见第6.3.2.3章
这就是为什么在将void指针强制转换为int *
,取消引用并打印结果时,它可以正确打印的原因。
但是,标准不能保证您可以取消引用该指针为其他数据类型。它实质上是在调用未定义的行为。
因此,解引用pf
或pd
以获得float
或double
就是undefined behavior,因为您正试图读取分配给int
的内存作为float
或double
。有一个明显的错误案例导致了UB。
详细地说,int
和float
(和double
)具有不同的内部表示形式,因此尝试将指针强制转换为另一种类型,然后尝试取消引用以获取另一种类型的值将不起作用。
相关,C11
,第§6.5.3.3章
对于无效值部分,(强调我的)