在一行中应用两个显式指针强制转换?

时间:2012-11-30 06:33:15

标签: c pointers casting

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

1 个答案:

答案 0 :(得分: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。否则,当再次转换回来时, 结果应比较等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。“

第2段说你可以将任何指针转换为其他类型,但如果结果指针没有对齐,那么behaviour is undefined

虽然第1段没有提及undefined behaviour的任何内容。

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

因此你也看到了同样的情况。

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