FreeBSDにパッケージ化された_startのコードを読んでいて、私が見ている特定の何かに興味があります。行61は、char**をvoid*にキャストし、すぐにlong*にキャストします。同様のStackOverflowの質問を見ましたが、すべてのポインターが同じサイズであるため、ここでは適用されません。この行が1回ではなく2回キャストされる理由を誰かに教えてもらえますか?
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標準で関連するものを見ることができます。