首页 > 解决方案 > C 是否曾经在第一个元素之前填充结构?

问题描述

考虑 C 编译器将执行填充的任意结构

struct node {
  enum type;
  size_t num_children;
  void** nodes;
};

C 会在第一个元素之前执行填充吗?我问这个是因为我需要做一些时髦的事情void*并要求

void* a = node->nodes[0];
enum type t = *(enum type*)(a);

将始终正确评估。我知道我可以不强制填充,但宁愿不强制。

标签: c

解决方案


C 会在第一个元素之前执行填充吗?

不,这在C 标准中是明确禁止的:

在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但不是在其开头。

(强调我的)。


推荐阅读