質問: %rsp という関係かと思います。 その前に、push %rbpがあるので、rbp->n はそのスタックのアドレスが入っているわけですよね。 その前は、call命令により関数のリターンアドレスが入っています。 linux 64bit Debian系 gccです。 どなたか教えてもらいないでしょうか?? ちなみに・・・ *p には rbp->nと同じ値が格納されていました。 ??? rbp->nとpが同じ結果になっていない理由がわかりません。
回答: C では `void*` は他のポインタ型と暗黙の型変換で自動的に変換されます。 たとえば `malloc` の返却値が `void*` であり、様々な形に使えることを思い出してください。 (C++ ではもう少し厳しい条件になっているようです。) なので `void*` から `layout *` 型には勝手に変換されてコンパイル時にはエラーにはなりません。 ただし、そのメモリにアクセスした結果について保証があるかは別問題です。 `__builtin_frame_address` が返したメモリの構造、つまりスタックフレームがどうなっているかはコンパイラのドキュメントをよく読んでそれに一致するように操作するしかありません。 型システムによる保護は何も期待できないのです。