如何读懂这个表达?

How to read this expression?

(long)&((FLASH_CONF_STRUCT*)0)->vlan

FLASH_CONF_STRUCT是一个struct类型,vlan是这个struct的成员。

这个表达式怎么拼?

(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