如何计算结构的偏移量?在这里解释printf语句? #包括 main() { 无符号字符c; typedef结构名{ 长a; int b; 长c; }r; r re={3,4,5}; r*na=&re; printf(“%d”,*(int*)((char*)na+(unsigned int)和((struct name*)0)->b)); }

如何计算结构的偏移量?在这里解释printf语句? #包括 main() { 无符号字符c; typedef结构名{ 长a; int b; 长c; }r; r re={3,4,5}; r*na=&re; printf(“%d”,*(int*)((char*)na+(unsigned int)和((struct name*)0)->b)); },c,pointers,casting,printf,offset,C,Pointers,Casting,Printf,Offset,输出: 四, 如果有人能详细解释printf语句在这个c程序中的作用,我将不胜感激?根据我的说法,int是铸造的。然后将char指针投射到na。但我不明白整个声明到底在做什么?你在这里干什么b不是指针,但似乎用作指针。我在c编程书中发现了这个问题。它似乎是计算结构偏移量,但我仍然不知道如何计算。请帮助我详细了解该程序。代码&((结构名称*)0)->b实际上被称为“offsetof”操作,实际上是一个 其思想是,如果a是a类型的结构,那么&a.b等于a的地址加上a中b的偏移量。由于此处使用NULL

输出:

四,

如果有人能详细解释printf语句在这个c程序中的作用,我将不胜感激?根据我的说法,
int
是铸造的。然后将
char
指针投射到
na
。但我不明白整个声明到底在做什么?你在这里干什么
b
不是指针,但似乎用作指针。我在c编程书中发现了这个问题。它似乎是计算结构偏移量,但我仍然不知道如何计算。请帮助我详细了解该程序。

代码
&((结构名称*)0)->b
实际上被称为“offsetof”操作,实际上是一个

其思想是,如果
a
a
类型的结构,那么
&a.b
等于
a
的地址加上
a
b
的偏移量。由于此处使用NULL而不是
a
的地址,因此结果只是
a
类型结构中
b
的偏移量

根据维基百科

其工作原理是将空指针强制转换为指向结构st的指针, 然后获取所述结构内的成员m的地址。 虽然此实现在许多编译器中都能正常工作,但它具有 根据C标准未定义的行为,因为它涉及 取消对空指针的引用(尽管有人可能认为 取消引用发生,因为整个表达式都是计算出来的 (在编译时)

让我们一步一步地看一下
printf
中的表达式

表达式
(unsigned int)和((struct name*)0)->b))
计算
struct name
b
的偏移量,如上所述,并将结果强制转换为整数。在大多数平台上,结果应该等于sizeof(long)

代码中的
(char*)na
na
转换为char指针,它是指向
结构名称的指针。这是必需的,因为
sizeof(char)
可以假定为1,而
sizeof(*na)
大于1。我们要做的是使用
*na
的地址作为原始数字地址,而不是doing,这样,如果例如
na==0x1234
,那么
((char*)na+4)
的结果等于
0x1234+4=0x1238


总和产生一个内存地址。该地址等于对象
na
中成员变量
b
的地址,类型为
char*
。知道这一点后,最后一步是将地址转换回
int*
(因为
b
的类型是
int
),然后取消对结果的引用(我们再次知道它指向
b
)。最后的结果是
b的值,然后打印出来。

我的实际问题是理解printf语句。我仍然像你一样投票支持你的答案tried@PunitVara:您还缺少哪些部件?我可以详述答案。一旦你理解了偏移量,剩下的就是简单的指针算法。如果你能一步一步地扩展这个语句,我真的很感谢你。指针算法的良好分解。基本上,这是一种复杂的表达方式,
printf(“%d”,na->b)谢谢@dbush为什么以unsigned int结尾?这是什么意思?
#include<stdio.h>
main()
{
        unsigned char c;
        typedef struct name {
                long  a;
                int b;
                long c;
        }r;
        r re = {3,4,5};
        r *na = &re;
        printf("%d", *(int*) ((char*)na + (unsigned int) & ( (struct name *)0 )->b));
}