#include<stdio.h>
int main()
{
struct node
{
int a, b, c;
};
struct node num = {3, 5, 6};
struct node *ptr = & num;
printf("%d\n", *((int*)ptr + 1 + (3-2)));
return 0;
}
答案 0 :(得分:0)
让我们简化
printf("%d\n", *((int*)ptr + 1 + (3-2)));
到
int *ip = (int*)ptr;
int *ip2 = ip + 2;
int v = *ip2;
printf("%d\n", v);
即。
“将ptr作为指向整数列表的指针,显示第三个整数的值。”
第一步,将指向该结构的指针视为指向整数数组的指针,这是在利用(滥用吗?)以下事实(前3个字段几乎肯定会存储为3个连续整数)。这有点狡猾,我会毫不犹豫地做到这一点。我将其留给其他人以严格遵循标准的方式指出其是否正确。我对此表示怀疑,因为我们可能在某些平台上存在填充问题
答案 1 :(得分:0)
num
是一种初始化为a=3
,b=5
和c=6
的结构。
ptr
是指向该结构的指针。一切正常,直到printf
行为止。
构造
*((int*)ptr + 1 + (3-2)))
首先强制转换ptr
,该指针指向指向int
的指针:
(int*)ptr
指针指向成员a
,并且定义明确。
现在将1添加到该指针:
(int*)ptr + 1
指针指向结构中成员a
的正上方。除非对该指针取消引用,否则所有内容都定义良好。最后,3 - 2
,即1
再一次添加到结果指针。
(int*)ptr + 1
行为现在未定义。
(int*)ptr + 1 + (3 - 2)
然后取消引用此无效指针,再次导致未定义的行为。
*((int*)ptr + 1 + (3 - 2))
打印出数字6且看起来像是该结构的第3个成员的原因只是a幸;)