我正在读the code for _start as packaged with FreeBSD,对我看到的一些特别的东西很好奇。第61行将字符**转换为空*,然后立即转换为长*。我见过a similar StackOverflow question,但它不适用于这里,因为所有的指针都是相同的大小。谁能告诉我为什么这条线会投射两次而不是一次?
发布于 2012-11-30 06:53:33
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标准中的相关内容。
https://stackoverflow.com/questions/13640161
复制相似问题