のメモリ割り当て(ある場合)は何ですか?また、書き込み時のメモリ割り当てはどこにありp
ます*p
か?**p
char **p = NULL
3 に答える
のサイズはp
その種類によって異なります。*p
and **p
(and ***p
、など) のサイズ**********p
は、ポインターのサイズです。通常、32 ビット システムと 64 ビット システムのどちらを使用しているかに応じて、4 バイトまたは 8 バイトです。
あなたが書くとき、あなたはあなたに与えるchar **p = NULL
ものを超えて追加のメモリを割り当てていません。char **p
メモリ内の変数の場所を初期化せずにそのままにするのではなく、値で初期化しているだけです。
それらがどこにあるかについては、文脈によって異なります。それらが関数内のローカル変数である場合、関数が呼び出されたときにスタックに割り当てられます。グローバル変数の場合、プログラムのデータ セグメント内の場所が与えられます。それらが a のメンバーである場合struct
、構造型の変数を宣言する場所によって異なります。
静的/グローバルでない場合、変数はスタックに格納されます。ここにはヒープメモリの割り当てはありません。それは単なる(無効な)メモリアドレスです。
を記述するとchar **p = NULL;
、p
ローカル変数 (ほとんどの場合、関数内で定義されている場合はスタック上) またはグローバル変数 (ほとんどの場合、スタック上でもヒープ上でもありません (どこからmalloc()
メモリが割り当てられるか) )、すべての関数の外で定義されている場合)。
*p
NULL ポインターを合法的に逆参照できないため、 の場所は未定義です。
**p
最初に逆参照する必要があるため、同じことが当てはまりますp
が、これは違法です。
等々。