13

calloc 要求メモリが使用され、すべてのビットに 0 が書き込まれ、それへのポインタが返されることはわかっています。

私の質問は: ポインターを含む構造体で calloc を使用する場合、それらのポインターは NULL 値を持ちますか、それとも NULL を指すように設定する必要がありますか?

struct a{
char * name;
void * p;
}* A;

基本的に、構造体 a で calloc を使用した後、name と p は NULL を指しますか?

ありがとう!

4

3 に答える 3

27

どういうわけか、あなたは多くの間違った答えを得ました。C では、NULL ポインターの表現がすべてゼロのビットである必要はありません。多くの人は、値が 0 の整数定数式をポインターに変換すると null ポインターになるため、そうであると誤解しています。

そうは言っても、すべての実世界のシステムでは、null ポインターはすべてゼロのビットでありcalloc、実世界で null ポインターで初期化されたポインター配列を取得するための完全に合理的な方法です。

于 2011-05-02T13:24:08.987 に答える
19

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 で同じです。

于 2014-08-08T20:49:51.657 に答える
-5

のISOC標準でcalloc は、すべてをに初期化する必要があります0。つまり、によって割り当てられたメモリcallocをポインタとして表示することになった場合、実際には最初はNULL(0)ポインタが含まれます。

于 2011-05-02T13:20:23.347 に答える