问题描述
在尝试调试我使用 Speex 时遇到的问题时,我注意到它(不仅是 Speex,还有一些示例代码)执行以下操作:
While trying to debug a problem I'm having using Speex, I noticed that it (well, not just Speex, but some example code as well) does the following:
- 从初始化函数返回一个指向 EncState 的指针
- 将该指针转换为空指针
- 存储空指针
- (其他地方)
- 将 void 指针转换为指向 SpeexMode 的指针
- 取消引用指针
碰巧 EncState
的定义以 SpeexMode *
类型的字段开始,因此指向第一个字段的指针和指向结构恰好是相同的.取消引用恰好在运行时起作用.
It so happens that the definition of EncState
starts with a field of type SpeexMode *
, and so the integer values of a pointer to the first field and a pointer to the struct happen to be the same. The dereference happens to work at runtime.
但是...语言实际上允许这样做吗?如果编译器编译它,它是否可以自由地做任何它想做的事?是否将结构 T*
转换为结构 C*
未定义行为,如果 T 的第一个字段是
C`?
But... does the language actually allow this? Is the compiler free to do whatever it wants if it compiles this? Is casting a struct T*
to a struct C*
undefined behavior, if T''s first field is a
C`?
推荐答案
来自 C11 标准:
(C11 §6.7.2.1.15:指向结构对象的指针,适当地转换后,指向它的初始成员……反之亦然.也许有作为结构对象内的未命名填充,但不是在其开始.")
这意味着您看到的行为是被允许和保证的.
Which means that the behavior you see is allowed and guaranteed.
这篇关于如果 T 的第一个字段是 C,是否将 struct T* 转换为 struct C* 未定义行为?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!