3

我正在阅读与 FreeBSD 一起打包的 _start 代码,并且对我所看到的特定内容感到好奇。第 61 行将 char** 转换为 void*,然后立即转换为 long*。我看过一个类似的 StackOverflow question,但它不适用于这里,因为所有指针的大小都相同。谁能告诉我为什么这条线投了两次而不是一次?

4

1 回答 1

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

虽然第 1 段没有说任何关于undefined behaviour.

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

因此,您看到的是相同的。

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

于 2012-11-30T06:53:33.167 回答