我已经过了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。