2010-05-14 2 views
6

Disons que je donne les résultats suivants:Cette initialisation de pointeur est-elle nécessaire?

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); 
} 

est la boucle pour initialiser chaque élément NULL nécessaire ou sont-ils NULL automatiquement calloc?

Répondre

13

Oui, l'affectation à NULL dans la boucle est nécessaire. calloc initialise à tous les bits 0. Mais un pointeur nul ne peut pas être représenté comme ça. Cela dépend de l'implémentation. Ainsi, l'affectation est nécessaire.

3

Non, calloc initialise ses tampons à 0.

+0

Spécifiquement, il initialise à "tous les bits 0", qui peut ne pas être "NULL" (ou 0 pour les valeurs "float" non plus, d'ailleurs). –

7

Cela dépend un peu de votre système, mais dans la grande majorité des cas c'est ok. calloc() vous renvoie un tampon rempli de zéros. Toutefois, le pointeur NULL sur votre machine peut ne pas être un modèle binaire de 0. Sur une machine où le pointeur NULL est différent de zéro, vous risquez de rencontrer des problèmes.

+2

S'appuyer sur un comportement qui fonctionne habituellement mais n'est pas garanti au travail est une mauvaise idée. Même si vous n'y courez jamais, ne serait-il pas plus facile de quitter la boucle et de simplement changer le 'calloc()' en un 'malloc()', donc personne ne serait tenté de sortir la boucle et de casser le code sur l'une de ces plates-formes exotiques? –

+0

+1 @Chris, c'est ce que je ferais. –

+0

correct, correct – Mandrake

Questions connexes