我正在阅读the code for _start as packaged with FreeBSD,并对我所看到的某些特别好奇。第61行将char **投射到void *,然后立即变为long *。我已经看过a similar StackOverflow question,但这里不适用,因为所有的指针都是相同的大小。谁能告诉我为什么这条线投了两次而不是一次?在一行中应用两个显式指针强制转换?
回答
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标准中看到相关的东西。
没有理由为什么首先投射到'void *'比在两个不同类型的指针之间直接投射更安全。两者都会导致未定义的行为。只有在'void *'和原始指针类型之间进行转换才是明确的。是的,这意味着很多野外代码依赖于未定义的行为。 – rubenvb
- 1. “printf”式时将整数指针不进行强制转换
- 2. C库警告(指针强制转换)
- 3. 强制转换为qsort函数指针
- 4. 强制转换为函数指针?
- 5. ObjC:间接指针强制转换成Objective-C的指针
- 6. 指针转换,无法将两个*转换为一个*
- 7. 赋值时将整数指针不进行强制转换
- 8. 链接表指针不进行强制转换错误
- 9. 警告“......让自整数指针不进行强制转换”
- 10. 初始化时将整数指针不进行强制转换
- 11. LINQ - 一个显式转换存在(是否缺少强制转换?)
- 12. 解除引用'void *'指针并强制转换不起作用
- 13. 从一个没有强制转换的指针中产生整数
- 14. 将const引用强制转换为const指针的常量指针
- 15. C通过将数组中的指针强制转换为void指针K&R
- 16. 显式强制转换为int并隐式强制转换为浮点型
- 17. C++强制转换指向静态方法的指针
- 18. 使整数指针没有使用strcpy强制转换
- 19. 在应用程序中使用BOOL变量委托:使用整型指针而不进行强制转换
- 20. 在一个文本中强制换行
- 21. 在扩展方法中使用显式强制转换
- 22. 不能将类型'decimal'隐式转换为'int'。一个显式转换存在(是否缺少强制转换?)
- 23. 不能将类型'System.Data.IDataReader'隐式转换为'System.Data.IDataAdapter'。一个显式转换存在(是否缺少强制转换?)
- 24. 不能将类型'object'隐式转换为'System.DateTime'。一个显式转换存在(是否缺少强制转换?)
- 25. 不能将类型'Newtonsoft.Json.Linq.JToken'隐式转换为'string'。一个显式转换存在(是否缺少强制转换?)
- 26. 在表达式树中显式强制转换?
- 27. 在Python中强制转换与强制
- 28. 如何使用reinterpret_cast的强制转换为派生类指针在C++中
- 29. const的指针指向const int的强制转换为const指针指向int的指针
- 30. 指针是否可以强制转换常量调用未定义的行为?
在这种情况下,转换为'(void *)'是无用的。 –
如果不是由GCC编译,该文件将出错,位于名为“amd64”的目录中,并且内嵌程序集。我不认为引用标准的任何答案在这里都是完全有意义的。在这个例子中,我也没有看到为什么要抛出'void *'的原因。 – asveikau