加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

&((struct name *)NULL – > b)在printf语句中

发布时间:2020-12-16 03:09:07 所属栏目:百科 来源:网络整理
导读:这个问题在这里已经有一个答案: Is apparent NULL pointer dereference in C actually pointer arithmetic?5个 我在一本书中发现这个代码示例,但是我无法理解printf语句中的表达式. 并且该程序成功地编译输出为4. 好心提醒… void main(){ unsigned char c;
这个问题在这里已经有一个答案:> Is apparent NULL pointer dereference in C actually pointer arithmetic?5个
我在一本书中发现这个代码示例,但是我无法理解printf语句中的表达式.
并且该程序成功地编译输出为4.
好心提醒…
void 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  *)NULL)->b)));
}

解决方法

让我们从最后一行开始:
printf("%d",*(int*)((char*)na + (unsigned int ) & (((struct name  *)NULL)->b)));

让我们解释一下:

(unsigned int ) & ((    (struct name  *)NULL)->b )

实际上是铸造(((struct name *)NULL) – > b)转换成unsigned int.

&安培; (((struct name *)NULL) – > b)是地址(即给出指针):

((  (struct name  *)NULL)->b )

这实际上是b(作为name.b)从NULL(0)的偏移量,它是4个字节(假设长度为4个字节)并转换为int的指针,给出2(假设int为2个字节).

如果不是NULL,那么它将是一个指向0xFFFF0000的指针,那么&(ptr-> b)将是0xFFFF0002.但是它更像&(0 – > b),所以它的0x00000002.

所以,(unsigned int)& (((struct name *)NULL) – > b)== 2(或者可能是1,或者可能是4,取决于机器).

其余的是简单的:*(int *)((char *)na 2将指向重新设置b,所以应该打印4(在代码中初始化了r re = {3,5} ).

P.S:即使(unsigned int)& (((struct name *)NULL) – > b)!= 2(也许是1,4或8) – 它仍然打印4,因为它然后使用相同的偏移来获取值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读