【发布时间】:2023-04-09 11:19:01
【问题描述】:
(long)&((FLASH_CONF_STRUCT*)0)->vlan
FLASH_CONF_STRUCT 是一个结构体类型,vlan 是这个结构体的成员。
这个词怎么拼写?
【问题讨论】:
标签: c flash struct typecast-operator
(long)&((FLASH_CONF_STRUCT*)0)->vlan
FLASH_CONF_STRUCT 是一个结构体类型,vlan 是这个结构体的成员。
这个词怎么拼写?
【问题讨论】:
标签: c flash struct typecast-operator
(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
【讨论】: