在C中明显的NULL指针取消引用实际上是指针算术吗?
我有这段代码。它似乎在这里取消引用空指针,但随后用
unsigned int
对结果进行按位与运算。我真的不明白整个部分。它打算做什么?这是指针算术的一种形式吗?
struct hi
{
long a;
int b;
long c;
};
int main()
{
struct hi ob={3,4,5};
struct hi *ptr=&ob;
int num= (unsigned int) & (((struct hi *)0)->b);
printf("%d",num);
printf("%d",*(int *)((char *)ptr + (unsigned int) & (((struct hi *)0)->b)));
}
我得到的输出是44.但它是如何工作的?
没有找到相关结果
已邀请:
5 个回复
亲奋漏
蹄渭信妥扳
,将其视为
,在它指向的结构中选择元素
,并获取该元素的地址。此操作的结果将是元素
从结构的开头偏移。当你将它添加到指针时,你得到的元素
等于
。
辩谷变充
结构内
字段的偏移量
是指向
结构的指针,从地址
开始。
是上述结构的
字段
是上述字段的地址。因为
结构位于地址
,这是结构中
的偏移量。
是从地址类型到
的转换,因此可以用作数字。 你实际上并没有取消引用一个
指针。你只是做指针算术。 访问
会给您一个分段错误,因为您正在尝试访问禁止的内存位置。 使用
不会给你分段错误,因为你只是获取该禁止内存位置的地址,但你并没有尝试访问所述位置。
苦诫
- 是
的
宏的常见实现;它不便携,但它经常有效。 第二个表达式将其添加到0(空指针)并给出相同的答案 - 4。 第二个表达式将
指向的对象的基地址加4,即结构中的值4。 您的输出不包含换行符 - 它可能应该(行为不是完全可移植的,因为如果您不包含换行符,则它是实现定义的:C99§7.19.2:“最后一行是否需要终止换行符是实现定义的。“)。在Unix机器上,它很乱,因为下一个提示将在44之后立即出现。
殿虫