当前位置:  开发笔记 > 编程语言 > 正文

void pointer = int pointer = float pointer

如何解决《voidpointer=intpointer=floatpointer》经验,为你挑选了1个好方法。

我有一个void指向内存地址的指针.然后,我做

intpointer = void指针

floatpointer = 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.dereferncing pd(double指针)输出一个不断变化的负分数?

为什么这和字节序有关(我的CPU是小端)?



1> Sourav Ghosh..:

按照C标准,你允许转换任何指针void *并将其转换回来,它将具有相同的效果.

引用C11,章节§6.3.2.3

[...]指向任何对象类型的指针可以转换为指向void和返回的指针; 结果应该等于原始指针.

这就是为什么当你将void指针转换为int *,取消引用并打印结果时,它会正确打印.

但是,标准并不保证您可以取消引用该指针为不同的数据类型.它本质上是调用未定义的行为.

所以,解引用pfpd获得float或者double是不确定的行为,因为你想读分配的内存int 一个floatdouble.有一个明显的mismtach案例导致UB.

详细说明,intfloat(和double)具有不同的内部表示,因此尝试将指针转换为另一种类型,然后尝试取消引用以获取其他类型的值将不起作用.

相关的C11,章节§6.5.3.3

[...]如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,*则未定义一元运算符的行为.

对于无效价值部分,(强调我的)

在由一元*运算符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有