我有一个指向内存地址的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 *,取消引用并打印结果时,它可以正确打印的原因。

    但是,标准不能保证您可以取消引用该指针为其他数据类型。它实质上是在调用未定义的行为。

    因此,解引用pfpd以获得floatdouble就是undefined behavior,因为您正试图读取分配给int的内存作为floatdouble。有一个明显的错误案例导致了UB。

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

    相关,C11,第§6.5.3.3章



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

    09-10 05:30
    查看更多