スタックのメモリアライメントを台無しにしました。x86プロセッサを搭載した最新のApple製品を使用していると思います。これらの仮定を考慮に入れると、スタックは両方の状況で次のようになります。
| スタック| 最初| 2番目|
+ --------------------- + ------- + -------- +
| 123 | | %d |
+ --------------------- +%lld + -------- +
| 0 | | %@ |
+ --------------------- + ------- + -------- +
| テキストへのポインタ| %@|無視|
+ --------------------- + ------- + -------- +
最初の状況では、スタックに8バイト、次に4バイトを配置します。そして、NSLogはスタックから12バイト(の場合は8バイト、の場合は%lld
4バイト%@
)を取り戻すように指示されます。
2番目の状況では、NSLogに最初に4バイト(%d
)を取るように指示します。変数の長さは8バイトで、保持する数が非常に少ないため、上位4バイトは0になります。NSLogがテキストを印刷しようとするとnil
、スタックから取得されます。
メッセージの送信nil
はObj-Cで有効であるため、NSLogは送信description:
しnil
ておそらく何も取得せずに出力します(null)。
結局、Objective-Cは追加されたCであるため、呼び出し元はこの混乱全体をクリーンアップします。