26

これは非常に基本的な質問のように思えるかもしれませんが、私の頭の中にあるので、次のようになります。

ローカル変数を割り当てると、スタックに入ります。同様に、動的割り当てにより、変数はヒープになります。さて、私の質問は、この変数が実際にスタックまたはヒープ上にあるのか、それともスタックとヒープ内の参照にすぎないのかということです。

例えば、

変数を宣言するとしますint i。これで、これiがスタックに割り当てられます。それで、のアドレスを印刷するとi、これはスタック上の場所の1つになりますか?ヒープについても同じ質問です。

4

6 に答える 6

76

あなたが何を求めているのか完全にはわかりませんが、答えられるように最善を尽くします。

i以下は、スタック上の変数を宣言します。

int i;

を使用してアドレスを要求すると&i、スタック上の実際の場所が取得されます。

を使用して何かを動的に割り当てるとmalloc、実際には2つのデータが格納されます。動的メモリはヒープに割り当てられ、ポインター自体はスタックに割り当てられます。したがって、このコードでは:

int* j = malloc(sizeof(int));

これは、ヒープに整数用のスペースを割り当てています。また、ポインター ( j) のスタックにスペースを割り当てています。変数jの値は、によって返されるアドレスに設定されmallocます。

于 2011-07-21T02:16:29.160 に答える
15

うまくいけば、次のことが役に立ちます。

void foo()
{
    // an integer stored on the stack
    int a_stack_integer; 

    // a pointer to integer data, the pointer itself is stored on the stack
    int *a_stack_pointer; 

    // make a_stack_pointer "point" to integer data that's allocated on the heap
    a_stack_pointer = (int*)malloc(10 * sizeof(int));
}

スタック変数の場合、変数自体 (実際のデータ) がスタックに格納されます。

ヒープ割り当てメモリの場合、基になるデータは常にヒープに格納されます。このメモリ/データへのポインタは、スタックにローカルに格納できます。

お役に立てれば。

于 2011-07-21T02:19:45.653 に答える
6

ポインター変数自体はスタックに常駐します。ポインタが指すメモリはヒープ上に存在します。

int *i = malloc(sizeof(int));

ii が指す実際のメモリ*iはヒープ上にあります。

于 2011-07-21T02:17:19.587 に答える
0

スタックまたはヒープは別個のメモリではなく、実行中のプログラムがシステムによって割り当てられるメモリ セグメントであり、メモリ内のデータを編成する方法が異なるだけです。

したがって、&i を取得すると、それは単純なメモリ アドレスです。

于 2011-07-21T02:19:13.467 に答える