2010-05-14 16 views
6

Digamos que tengo los siguientes:¿Es necesaria la inicialización de este puntero?

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

es el bucle para inicializar cada elemento a NULL necesaria o son automáticamente NULL de calloc?

Respuesta

13

Sí, la asignación a NULL en el bucle es necesaria. calloc se inicializa a todos los bits 0. Pero un puntero nulo no se puede representar así. Depende de la implementación. Por lo tanto, la tarea es necesaria.

3

No, calloc inicializa sus almacenamientos intermedios en 0.

+0

Específicamente, se inicializa a "todos los bits 0", que pueden no ser 'NULL' (o 0 para valores' float', para el caso). –

7

Eso depende un poco de su sistema, pero en la gran mayoría de los casos está bien. calloc() le devuelve un búfer lleno de ceros. Sin embargo, el puntero nulo en su máquina podría no ser un patrón de bits de 0. En una máquina donde el puntero nulo no es cero, puede terminar en problemas.

+2

Confiar en el comportamiento que generalmente funciona pero que no se garantiza que funcione es una mala idea. Incluso si nunca te topas, no sería más fácil abandonar el bucle y simplemente cambiar el 'calloc()' a un 'malloc()', para que nadie se sienta tentado de sacar el bucle y romper el código en una de esas plataformas exóticas? –

+0

+1 @Chris, eso es lo que haría. –

+0

correcto, correcto – Mandrake

Cuestiones relacionadas