这个表达式怎么读?

And*_*Lin 1 c flash struct typecast-operator

(long)&((FLASH_CONF_STRUCT*)0)->vlan
Run Code Online (Sandbox Code Playgroud)

FLASH_CONF_STRUCT是结构类型,并且vlan是该结构的成员。

这个表达式怎么拼?

ike*_*ami 7

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

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

&获取后续内容的地址,因此将偏移量vlan添加到ptr.

(long)将地址强制转换为long.

总的来说,这是为了获得vlan结构内的偏移量。但我怀疑它调用了未定义的行为(因为它至少取消了 NULL 指针的引用)。它这样做是不必要的。

代替

long ofs = (long)&((FLASH_CONF_STRUCT*)0)->vlan;
Run Code Online (Sandbox Code Playgroud)

更具可读性

#include <stddef.h>

size_t ofs = offsetof(FLASH_CONF_STRUCT, vlan);
Run Code Online (Sandbox Code Playgroud)

例如,

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

long ofs = (long)&((FLASH_CONF_STRUCT*)0)->vlan;
Run Code Online (Sandbox Code Playgroud)