Cでは、ポインタに別の変数のメモリ位置が含まれています。ポインタ変数はスタックまたはヒープに格納されていますか?
3 に答える
ポインタは単なる変数です。メモリ位置を保持する整数と考えてください。
int main(...) {
char *ptr = malloc( 100 );
...
}
thenptr
は、ヒープから割り当てられた 100 バイトのバッファーのメモリ位置を含む、スタック上の 4 バイトまたは 8 バイトの値です。メモリ自体はヒープにあり、ポインタはスタックにあります。
場合によります。ヒープ メモリは 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 からのメモリは解放しないことに注意してください。
関数で何かへのポインターを受け取った場合、それがスタックからメモリを参照しているのか、ヒープからメモリを参照しているのかわかりません。
どこかに保管されています!
ポインタをどのように定義するかはあなた次第です。
ローカル変数の場合は、スタック上またはレジスタ内にある可能性があります。
malloc() を介して作成すると、ヒープ上にあります。
または、モジュール スコープで定義されている場合はグローバルです。
int *pInt_global;
void foo(void)
{
int *pIntStack;
int **ppIntHeap;
ppIntHeap = malloc(sizeof(int *));
}