如何计算结构的偏移量?在这里解释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语句在这个c程序中的作用,我将不胜感激?根据我的说法,如何计算结构的偏移量?在这里解释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
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));
}