特定の構造体へのポインタを作成するとき、それを NULL に設定して割り当ててから使用する必要がありますか? なぜ?
6 に答える
いいえ、 に設定する必要はありませんが、新しいポインターに値を与えて、 (まだ) 何も指していないことを明示NULL
するため、良い習慣と考える人もいます。
ポインタを作成し、すぐに別の値を代入する場合、それを に設定してもあまり価値がありませんNULL
。
NULL
ただし、ポインタが指していたメモリを解放した後でポインタを設定することをお勧めします。
いいえ、(言語に関する限り)ポインタ変数を宣言するときに何かに初期化する必要はありません。したがって
T* ptr;
ptr
は、不確定な値で名前が付けられた変数を導入する有効な宣言です。最初に何かを割り当てたり、特定の値に設定したりせずに、特定の方法で変数を使用することもできます。
func(&ptr);
いいえ、初期化は null ポインターに対して行う必要があることを忘れないでください。現代の C で非常に便利なイディオムは、最初の使用時に変数を宣言することです。
T * ptr = malloc(sizeof *ptr);
これにより、型を覚えたり、変数が既に初期化されているかどうかを覚えたりする手間が省けます。後で初期化される場所がわからない場合にのみ (または場合でも)、確実に null ポインターに初期化する必要があります。
したがって、経験則として、常に変数を適切な値に初期化してください。0
より適切なものが手元にない場合は、「タイプに適した」が常に適切な選択です。すべての型について、C はそのように作成され、機能します。
ほとんどの場合、変数を初期化しないことは時期尚早の最適化です。実際のパフォーマンスのボトルネックがあることがわかった場合にのみ、変数を確認してください。特に、初期値を使用する前に同じ関数内に割り当てがある場合、最新のコンパイラは初期化を最適化します。最初にプログラムの正確性を考えてください。
しばらくぶら下げたくない場合を除き、そうする必要はありません。解放した後(守備スタイル)にすべきだと知っています。
NULL に初期化する必要はありません。すぐに割り当てたい場合は、スキップできます。
At は、次の例のようにエラー処理に役立ちます。この場合、p
割り当て後に最後までブレークすると、初期化されないままになりq
ます。
int func(void)
{
char *p;
char *q;
p = malloc(100);
if (!p)
goto end;
q = malloc(100);
if (!q)
goto end;
/* Do something */
end:
free(p);
free(q);
return 0;
}
また、これは私の個人的な好みですが、常に構造体を割り当てcalloc
ます。文字列は初期化せずに割り当てることができますmalloc