And*_*Lin 1 c flash struct typecast-operator
(long)&((FLASH_CONF_STRUCT*)0)->vlan
Run Code Online (Sandbox Code Playgroud)
FLASH_CONF_STRUCT是结构类型,并且vlan是该结构的成员。
这个表达式怎么拼?
(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)