2

バックグラウンドで何が起こっているかを実験した後、スタックメモリの構成に非常に興味があり、本から得た小さな知識と明らかに一致していることがわかりました。私が理解していることが正しいかどうかを確認したかっただけです。

私は基本的なプログラムを持っています - 2 つの関数があります。最初の 1 つは foo で、もう 1 つは main (エントリ ポイント) です。

void foo(){
    // do something here or dont
}

int main(){

    int i = 0;

    printf("%p %p %p\n",foo, &i, main);

    system("PAUSE");
    return EXIT_SUCCESS;
};

プログラムの出力を以下に示します。main のローカル変数 i はまったく関係のない位置にあります。integer は値型ですが、main に対してローカルな char * ポインターで再度チェックし、同様の結果を取得します。

00401390 0022FF44 00401396
Press any key to continue . . .

私は主に、コードと変数がメモリの異なるセグメント (コード セグメント/データ セグメント) に割り当てられていることを理解しています。基本的に、コール スタックは関数の実行に関する基本的な情報 (ローカル変数、パラメーター、ポイントを返す) を折りたたみ、それらをデータ セグメントに保持すると言うのは正しいでしょうか?

4

5 に答える 5

1

はい、その通りです。コードとデータは、異なるパーミッションでメモリの異なる部分に存在します。スタックは、パラメーター、戻りアドレス、およびローカル (「自動」) 変数を保持し、データとともに存続します。

于 2009-04-29T14:38:39.423 に答える
0

はい。

コード メモリが ROM で、データ メモリが RAM (一般的な小型チップ アーキテクチャ) であるとします。次に、スタックがデータ メモリにある必要があることがわかります。

于 2009-04-29T14:47:23.273 に答える