我已经过了this code,我注意到这看起来很奇怪

oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1));

在我看来,第一个强制转换会影响+1,因此它将移动4个字节(一个指针),第二个强制转换将结果作为unsigned long long *。内 shell 上的 shell 中的星形是“访问此内存”星形。
  • 是吗?
  • 如果原先的定义是一个指针,而我们要转换为另一个指针,为什么还要麻烦,+1仍然会跳4个字节。
  • 如果我改写oldidt = *(oldidt+1);会怎样? (假设编译器没有抱怨,并给出并执行)
  • oldidt的声明是:
    static unsigned long long *oldidt;
    

    我根据调用将类型转换称为“第一个”和“第二个”(左为第二个)。

    最佳答案

    看起来这段代码正在使用几个unsigned short int来将指针存储为两半。假设unsigned short int的宽度是指针的一半。该代码正在从两个相邻的short(即数组的第二和第三成员)中提取存储的指针,并将其解释为指向unsigned long long int的指针。

    因此,最后的转换对于将整数重新解释为指针是必需的,而第一个(内部)转换用于从现有变量中读取不同类型的值,即从short(或从相邻的两个short)读取long。

    07-24 09:44
    查看更多