如何读取此表达式?

问题描述 投票:1回答:1
(long)&((FLASH_CONF_STRUCT*)0)->vlan

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

如何拼写此表达式?

c flash struct typecast-operator
1个回答
7
投票

(FLASH_CONF_STRUCT*)是类型转换。它会将0强制转换为指向FLASH_CONF_STRUCT的指针。我们称它为ptr

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

[&获得后面的地址,因此将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
© www.soinside.com 2019 - 2024. All rights reserved.