c - 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 标准中是明确禁止的:
在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但不是在其开头。
(强调我的)。
推荐阅读
- mongodb - 无法从heroku连接到Mongodb数据库
- django - 如何在 Django REST Framework 中使用自定义 YAML 文件作为 API 文档?
- c# - 在表单对象(本机类)上按住鼠标按钮时的延迟操作
- java - 命令行参数缺少特殊字符,例如!当通过 Inno Setup 中的批处理文件运行时
- javascript - Angular - 如何延迟 HTTP 请求
- linux - 我正在尝试获取文本文件中的文件夹路径
- javascript - React.js (w/ Electron) 未安装组件状态更改警告
- c - 定义 int a[3] 后,int* b = a 和 int (*c)[3] = &a 之间有什么区别吗?
- python - VBA调用python代码打开shell但崩溃
- javascript - 如何检查我的字符串是否以 WA 结尾,后跟 9 位数字