0

Cでは、ポインタに別の変数のメモリ位置が含まれています。ポインタ変数はスタックまたはヒープに格納されていますか?

4

3 に答える 3

3

ポインタは単なる変数です。メモリ位置を保持する整数と考えてください。

int main(...) {
    char *ptr = malloc( 100 );
    ...
}

thenptrは、ヒープから割り当てられた 100 バイトのバッファーのメモリ位置を含む、スタック上の 4 バイトまたは 8 バイトの値です。メモリ自体はヒープにあり、ポインタスタックにあります。

于 2012-06-27T12:53:54.570 に答える
1

場合によります。ヒープ メモリは malloc で作成されるものであり、スタック メモリは malloc で作成されないものです (簡単に言えば、静的メモリについても説明する必要があります)。

int a;
int* ps;
int* ph;

ps = &a;
ph = malloc(sizeof(int));
a  = 5;

if (ph != NULL) {
    *ph = 5;
}

ここで、ps にはスタック (a) からの変数のアドレスが含まれ、ph にはヒープからの変数のアドレスが含まれます。malloc が失敗しなかった場合、どちらも値 5 を参照することに注意してください。また、 ph に割り当てられたメモリはある時点で解放する必要がありますが、 ps からのメモリは解放しないことに注意してください。

関数で何かへのポインターを受け取った場合、それがスタックからメモリを参照しているのか、ヒープからメモリを参照しているのかわかりません。

于 2012-06-27T12:54:33.710 に答える
1

どこかに保管されています!

ポインタをどのように定義するかはあなた次第です。

ローカル変数の場合は、スタック上またはレジスタ内にある可能性があります。
malloc() を介して作成すると、ヒープ上にあります。
または、モジュール スコープで定義されている場合はグローバルです。

int *pInt_global;

void foo(void)
{
  int *pIntStack;

  int **ppIntHeap;

  ppIntHeap = malloc(sizeof(int *));
}
于 2012-06-27T12:52:00.237 に答える