私は次のプログラムを持っています。次の64ビットマシンでなぜ-4を出力するのだろうか?私の仮定のどれが間違っていましたか?
[Linux ubuntu 3.2.0-23-generic#36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux]
上記のマシンとgccコンパイラでは、デフォルトでbを最初と2番目にプッシュする必要があります。スタックは下向きに成長します。したがって、bのアドレスは高く、aのアドレスは低くする必要があります。したがって、結果はポジティブになるはずです。しかし、私は-4を得ました。誰かがこれを説明できますか?
引数は、スタックフレームで2バイトを占める2文字です。しかし、私は違いを4と見なしましたが、予想どおり1です。誰かがアライメントのせいであると言っても、2文字の構造は4バイトでアライメントされていないのではないかと思います。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> void CompareAddress(char a, char b) { printf("Differs=%ld\n", (intptr_t )&b - (intptr_t )&a); } int main() { CompareAddress('a','b'); return 0; } /* Differs= -4 */