【问题标题】:why doesn't this segfault? [duplicate]为什么没有这个段错误? [复制]
【发布时间】:2012-08-06 09:24:37
【问题描述】:

可能重复:
Why does this C code work?

为什么在结构中查找字段偏移量的代码不给出段错误?

#define offset(structName,fieldName) (&((structName *)0)->fieldName)

【问题讨论】:

  • 很有趣,通常人们会问为什么他们的代码确实会出现段错误...
  • 可能;从技术上讲,这是未定义的行为。但是大多数编译器会将其优化为一个常数,因此在这些编译器中,这可以用作 offsetof() 的实现。通常,offsetof() 的实现由编译器决定; gcc 确实使用了 __builtin_offsetof()。
  • 关于 offsetof 的维基百科页面提供了一些线索:en.wikipedia.org/wiki/Offsetof
  • 而与编译器一起提供的库可以做这样的事情,因为库确切地知道编译器会用它做什么。作为程序员,你不应该(除非你不关心可移植性并且编译器明确保证它)。
  • 未定义的行为并不意味着“这会崩溃”。这意味着行为未定义。

标签: c++ c


【解决方案1】:

因为它没有访问任何数据。它只是计算一个地址。 尝试执行以下任一操作:

foo = *offset(MyStruct, MyField);
*offset(MyStruct, MyField) = 1234;

你会看到一个漂亮的 SEGFAULT :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2020-10-16
    • 2021-04-10
    相关资源
    最近更新 更多