R.の答えは良いですが、これをサポートするために標準の引用符を追加し、実際にNULLポインターを生成する構造体を0初期化する方法を示したいと思います。
N1548 (C11ドラフト)より
7.22.3.2 calloc 関数は、それぞれのサイズが size である nmemb オブジェクトの配列にスペースを割り当てます。スペースはすべてのビットが 0 に初期化されます。[289]
脚注には次のように書かれています (強調を追加)。
これは、浮動小数点ゼロまたはヌル ポインター定数の表現と同じである必要はないことに注意してください。
通常、ヌル ポインターはすべて 0 のビットとして表されますが、この表現は保証されません。あなたの質問に直接答えるために、いいえ、calloc()
構造体のポインタがNULL
.
動的に割り当てられた構造体に含まれるすべてのポインターを設定するNULL
場合は、次を使用できます。
struct a *s = malloc(sizeof *s);
*s = (struct a){0};
C11:
6.7.9.21
集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子の数が少ない場合、[...] 集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。
と
6.7.9.10
... 静的またはスレッドの保存期間を持つオブジェクトが明示的に初期化されていない
場合: — ポインター型の場合、NULL ポインターに初期化されます。
C では、中かっこ内に少なくとも 1 つの要素が必要です。これが、{0}
代わりに を使用する理由です{}
。残りの要素は上記の規則に従って初期化され、結果として null ポインターになります。私の知る限り、このルールは C11 と C99 で同じです。