【问题标题】:Applying two explicit pointer casts in a row?连续应用两个显式指针强制转换?
【发布时间】:2012-11-30 06:33:14
【问题描述】:

我正在阅读the code for _start as packaged with FreeBSD,我对我所看到的一些特别的东西感到好奇。第 61 行将 char** 转换为 void*,然后立即转换为 long*。我见过a similar StackOverflow question,但它不适用于这里,因为所有指针的大小都相同。谁能告诉我为什么这条线投了两次而不是一次?

【问题讨论】:

  • 在这种情况下,转换为(void*) 是没有用的。
  • 这个文件如果不是被 GCC 编译的话会报错,它位于一个名为“amd64”的目录中,并且里面有内联汇编。我认为引用该标准的任何答案在这里都不会完全有意义。我也看不出为什么在这个例子中应该有 void * 的演员表。

标签: c pointers casting


【解决方案1】:
ISO c99 : 6.3.2.3 Pointers 

1

" 指向 void 的指针可以转换为指向任何不完整或对象的指针或从指针转换为指向任何不完整或对象的指针 类型。指向任何不完整或对象类型的指针可以转换为指向 void 的指针 又回来了;结果应与原始指针比较。"

7

" 指向对象或不完整类型的指针可以转换为指向不同类型的指针 对象或不完整的类型。 If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined。否则,当再次转换回来时, 结果应比较等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续递增,直到对象的大小,产生指向对象剩余字节的指针。"

第二段说您可以将任何指向一种类型的指针转​​换为另一种类型,但如果结果指针未对齐,则behaviour is undefined

虽然第一段没有提到任何关于 undefined behaviour 的内容。

所以我认为将void * 转换为任何类型比直接从一种类型转换为另一种类型更安全。

因此你看到的是相同的。

编辑:我认为这不是您问题的确切答案,但至少您可以在上面提到的 c99 标准中看到相关内容。

【讨论】:

  • 没有理由说首先转换为void* 比直接在指向两种不同类型的指针之间转换更安全。两者都会导致未定义的行为。只有void* 和原始指针类型之间的转换是明确定义的。是的,这意味着很多代码都依赖于未定义的行为。
猜你喜欢
  • 2013-10-20
  • 2016-04-13
  • 1970-01-01
  • 2012-01-10
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多