1

このコードを試すまで、変数のメモリアドレスがどんどん大きくなると思っていました:

#include <stdio.h>  

int main()
{
    int IamfirstVariable = 9;
    char array1[10] = {'0','1','2','3','4','5','6','7','8','9'};
    char array2[10] = {'0','1','2','3','4','5','6','7','8','9'};
    char IamLastVariable = '0';
    printf("variable start :%p\n",&IamfirstVariable);
    printf("array1 address start :%p    end :   %p \n",&array1[0],&array1[9]);
    printf("array2 address start :%p    end :   %p \n",&array2[0],&array2[9]);
    printf("variable end :%p\n",&IamLastVariable);
    return 0;
}

出力:

variable start :0xbfb02c3c
array1 address start :0xbfb02c32    end :   0xbfb02c3b 
array2 address start :0xbfb02c28    end :   0xbfb02c31 
variable end :0xbfb02c27

私はこれに行き詰まっています。最後に宣言された変数が最小のアドレスを取得するようです!

誰かが私のためにこれを説明できますか?

- - - - - - - - - - - 編集 - - - - - - - - - - - - - - -------------

回答のリンクを読んで、別の質問を受けました:

スタックが下向きに光るのに、配列のアドレスがまだ上向きに光るのはなぜですか?

4

3 に答える 3

3

Intel ではスタックが下向きに成長するためです (例: https://stackoverflow.com/a/1691818/613130を参照)。あなたarray1array2ビーイングのローカル変数はスタックに割り当てられます。これは C 固有ではなく、プラットフォーム固有であることに注意してください。異なるプラットフォームでは、上向きに成長する可能性があります。

上向きまたは下向きに成長するスタックを持つアーキテクチャに興味がある場合は、同様の質問がすでに行われています: https://stackoverflow.com/a/664779/613130

于 2013-08-31T13:48:09.120 に答える
2

変数はスタックに格納されるためです。

スタック メモリの割り当ては非常に単純なアルゴリズムを使用します。スタック ポインタは最初の空きスペースを指し、変数を追加するたびに下に移動します。

参照:スタックを理解する

于 2013-08-31T13:47:34.333 に答える
1

空のスタックを見てみましょう

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |
    :        |       |
0xFFFFFFFF   |       | ==>position of stack pointer
            -----------    

変数1が宣言されると、var1へのメモリがスタックに割り当てられ、スタックポインタの位置が上がります。

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |
    :        |       |==>position of stack pointer
0xFFFFFFFF   | var1  |
            -----------

変数2が宣言されると、var2へのメモリがスタックに割り当てられ、スタックポインタの位置が上がります。

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |==>position of stack pointer
    :        | var2  |
0xFFFFFFFF   | var1  |
            -----------

したがって、最後に宣言された変数は最小のアドレスを取得し、最初に宣言された変数は最大のアドレスを取得します。

于 2013-08-31T14:09:54.050 に答える