2016-02-03 15 views
5

は、ここでコードの一部:あなたが見ることができるようにスタックで、我々は右のスタックにbuffer ABOVE checkを持っている必要がありますので、asm x86での変数宣言の順序は?

int main() 
{ 

    char buffer[64]; 
    int check; 
... 

checkは、buffer AFTER 宣言されていますか? gdbでしかし

、私は(x86の)を解体それが、これは私が得たものである:

- >check0xbffff4f8

で - 0xbffff4b8

で>buffer私の質問:ローカル変数のスタックには特定の順序がありますか?

また、同じことを別のコンピュータ(x86でも同じgccコンパイルオプションですが、gdbのバージョンとLinuxディストリビューションとで異なる)で試してみましたが、その順序は同じではありません。 S

ありがとうございます!

PS:あなたはより多くの細部をしたい場合は、スクリーンショットを参照してください。(コンピュータ2とコンピュータ1と右と左)enter image description here

+13

いいえ、コンパイラはそれらを特定の順序で格納する必要はありません。変数がレジスタに収まるか、完全に最適化されていれば、変数はまったくメモリに格納されないこともあります。 – Jester

+2

変数は任意の順序で指定することができ、変数の前、後、または間に任意の数のパディングバイトが存在することがあります。 – user3386109

+2

明確にするために、パディングバイトはアラインメントを保持するために使用されます。 –

答えて