• [^] # Re: Comportement attendu

    Posté par . En réponse au journal Compilateur trop intelligent. Évalué à 3.

    En fait « 0 » est une valeur spéciale du point de vue du compilateur. En effet, « 0 » peut initialiser un nombre mais aussi un pointeur :

    int foo = 0;
    int *bar = 0;
    int (*baz)() = 0;

    Certaines machines ont une valeur pour les pointeurs nuls qui n'est pas forcément 0. Dans un tel cas le compilateur utilisera cette valeur en mémoire pour initialiser le pointeur. Le programmeur quand à lui ne ce préocuppe pas de cette valeur spéciale, tout le travail de conversion de 0 à la valeur réelle utilisée en mémoire par la machine est fait par le compilateur.

    Notons que pour initialiser un pointeur il est aussi possible d'utiliser (void*)0. NULL en pratique peut avoir deux définitions possible :

    #define NULL 0
    #define NULL (void*)0

    Mais la seconde définition est préférable, en effet, le code suivant est invalide si NULL vaut 0, car l'opérateur de conversion %p doit être utilisé avec un pointeur et non un entier :

    printf("%p", NULL); // Erreur si NULL = 0

    0 et (void*)0 sont des valeurs spéciales qui peuvent être utilisées pour initialiser tout types de pointeurs, y compris les pointeurs de fonctions :

    int (*foo)() = 0;
    int (*bar)() = (void*)0;
    int (*baz)() = (void*)(void*)0; // Erreur