本文介绍了如果 T 的第一个字段是 C,是否将 struct T* 转换为 struct C* 未定义行为?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

在尝试调试我使用 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* 未定义行为?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 10:01