2010-05-14 7 views
6

Können sagen, ich habe folgendes:Ist diese Pointer-Initialisierung notwendig?

CHARLINK * _init_link(CHARLINK **link) 
{ 
    short i; 
    (*link)->cl = (CHARLINK **) calloc(NUM_CHARS, sizeof(CHARLINK *)); 
    for (i = 0; i < NUM_CHARS; i++) 
     (*link)->cl[i] = NULL; 
    return (*link); 
} 

Ist die Schleife jedes Element zu initialisieren notwendig auf NULL oder sind sie von calloc automatisch NULL?

Antwort

13

Ja, die Zuweisung an NULL in der Schleife ist notwendig. calloc initialisiert auf alle Bits 0. Aber ein Nullzeiger darf nicht so dargestellt werden. Es ist abhängig von der Implementierung. Somit ist die Zuordnung notwendig.

3

Nein, Calloc initialisiert seine Puffer auf Nullen.

+0

Insbesondere initialisiert es "alle Bits 0", die nicht "NULL" sein dürfen (oder 0 für "float" -Werte entweder, für diese Angelegenheit). –

7

Das hängt ein wenig von Ihrem System ab, aber in den allermeisten Fällen ist es in Ordnung. calloc() gibt Ihnen einen Puffer zurück, der mit Nullen gefüllt ist. Der Nullzeiger auf Ihrem Computer ist jedoch möglicherweise kein Bitmuster von 0. Auf einem Computer, auf dem der Nullzeiger ungleich Null ist, können Probleme auftreten.

+2

Es ist eine schlechte Idee, sich auf ein Verhalten zu verlassen, das normalerweise funktioniert, aber nicht garantiert funktioniert. Selbst wenn Sie nie darauf stoßen würden, wäre es nicht einfacher, die Schleife zu verlassen und einfach 'calloc()' in ein 'malloc()' zu ändern, so dass niemand versucht wäre, die Schleife zu entfernen und den Code zu brechen auf einer dieser exotischen Plattformen? –

+0

+1 @Chris, das würde ich tun. –

+0

richtig, richtig – Mandrake