【问题标题】:How to read this expression?这个表达式怎么读?
【发布时间】:2023-04-09 11:19:01
【问题描述】:
(long)&((FLASH_CONF_STRUCT*)0)->vlan

FLASH_CONF_STRUCT 是一个结构体类型,vlan 是这个结构体的成员。

这个词怎么拼写?

【问题讨论】:

    标签: c flash struct typecast-operator


    【解决方案1】:

    (FLASH_CONF_STRUCT*) 是一个类型转换。它将0 转换为指向FLASH_CONF_STRUCT 的指针。我们称之为ptr

    ptr->vlan 等价于(*ptr).vlan。它访问ptr指向的结构的vlan字段。

    &得到后面的地址,所以vlan的偏移量加到ptr上。

    (long) 将地址转换为 long

    总的来说,这是为了在结构中获取vlan 的偏移量。但我怀疑它会调用 Undefined Behaviour (因为它至少会取消引用 NULL 指针)。而且这样做是不必要的。

    替换

    long ofs = (long)&((FLASH_CONF_STRUCT*)0)->vlan;
    

    可读性更强

    #include <stddef.h>
    
    size_t ofs = offsetof(FLASH_CONF_STRUCT, vlan);
    

    例如,

    #include <stddef.h>
    #include <stdio.h>
    
    typedef struct {
       int a;
       int b;
       int vlan;
    } FLASH_CONF_STRUCT;
    
    int main(void) {
       printf("%ld\n", (long)&((FLASH_CONF_STRUCT*)0)->vlan);
       printf("%zu\n", offsetof(FLASH_CONF_STRUCT, vlan));
       return 0;
    }
    

    输出:

    $ gcc -Wall -Wextra -pedantic-errors -std=c99 a.c -o a && a
    8
    8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多