1

これは、私が勉強している試験問題に出題された問題です。

「以下のコードを調べてください。32 ビット Linux プロセスのアドレス空間の構成を示す図を描いてください。図に、a、b、c、*c (つまり、c が指すメモリ)、malloc のおおよその位置にラベルを付けます。そしてメイン」

int a; int b = 10;
int main()
{
  char *c;
  c = malloc(b);
  return (0);
}

これが私の見解です、間違っていたら訂正してください。

a は初期化されていないグローバル変数であるため、ゼロに初期化されて BSS に格納されます。b は初期化されたグローバル変数であるため、データ セグメントに移動します。*c は自動変数なので、スタックに格納されます。c は動的に割り当てられるため、ヒープに移動します。Main は実行コードなので、テキストに格納されます。

malloc の部分についてはよくわかりませんが、テキストにも入るプログラムコードだけですか、それとも関数呼び出しとしてスタックにあるのでしょうか?

4

1 に答える 1

2

あなたは変数についてほとんど正しいです。ただし、小さな修正が 1 つあります。cはポインタ変数を参照し、 *cはcが指すメモリを参照します。したがって、c は自動変数であり、スタックに置かれ、 *cは動的に割り当てられるメモリであるため、ヒープに常駐します。

malloc については、スタックを使用して関数呼び出しを行うことができます。つまり、malloc に渡す引数はスタックを使用して渡すことができますが、関数、つまり実行可能部分はテキストセクションに存在します。main() は、スタック上に malloc() の引数を作成し、その値を設定してからPC= malloc() のアドレスを設定します。引数が 1 つしかないため、スタックの代わりにレジスターを使用して malloc への引数が渡される可能性もありますが、これはコンパイラーごと、およびプラットフォームごとに異なる可能性があります。

于 2012-08-10T09:16:24.580 に答える