2012-11-30 37 views
3

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

+2

在这种情况下,转换为'(void *)'是无用的。 –

+0

如果不是由GCC编译,该文件将出错,位于名为“amd64”的目录中,并且内嵌程序集。我不认为引用标准的任何答案在这里都是完全有意义的。在这个例子中,我也没有看到为什么要抛出'void *'的原因。 – asveikau

回答

1
ISO c99 : 6.3.2.3 Pointers 

“的孔隙的指针可被转换成或从一个指针到任何不完整的或对象 类型。一个指针,指向任何不完整的或对象类型可被转换成一指向void 并返回,结果应与原始指针相等。“

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

第二段说,你可以将任何指针转换为一种类型为其他类型,但如果结果指针未对齐,然后behaviour is undefined

虽然第一段没有说关于undefined behaviour的任何事情。

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

因此,你看到相同。

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

+1

没有理由为什么首先投射到'void *'比在两个不同类型的指针之间直接投射更安全。两者都会导致未定义的行为。只有在'void *'和原始指针类型之间进行转换才是明确的。是的,这意味着很多野外代码依赖于未定义的行为。 – rubenvb

相关问题