2009年3月16日月曜日

C言語のスタック変数について

下記をredhat9で実行すると、以下のようにメモリに展開されている
ことを確認できる。
int main(void)
{
char tryChar = 'a';
char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}

0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 62 <- tryChar2 address
0xbfffd657 : 61 <- tryChar address

・先に宣言された変数のアドレスの値は大きい、なので、
スタックに入っていることはわかる。
・0x12345678のはずのintは実際に78563412のようにメモリに
配置している。
・tryChar2をコメントアウトすると、tryCharとtryShortの間に
1バイトのゴミが生成されたことを確認できる。
int main(void)
{
char tryChar = 'a';
// char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}

0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 01 <- バイトアライメント
0xbfffd657 : 61 <- tryChar address

0 件のコメント: