• [^] # Re: Petites precisions

    Posté par . En réponse au journal J'adore Linus. Évalué à 1.

    > > static char* p ;
    > p est un null pointer

    Non, c'est initialisé à 0.


    Si, section 6.5.8 'Initialization', paragraphe #10 :
    If an object that has static storage duration is not initialized explicitly, then:

    - if it has pointer type, it is initialized to a null
    pointer;
    pour la norme: http://www.vmunix.com/~gabor/c/draft.html(...)
    j'en ai une version dans un .txt (je sais plus où je l'ai trouvée), compréssée, elle ne fait que 288K :) !


    > > void * p = (void *)(p1 - p2) ;
    > 0 pour p

    Pourtant tu dis : '0' même signification que '(void *)0' même signification que null pointeur. Or ici j'ai bien '(void *)0' (c-à-d null pointeur) et tu dis que c'est 0. Pas claire.


    NULL, c'est '0' ou '(void *)0' mais avec un zéro comme constante (le caractère 48 du charset US-ASCII si tu préfères :).
    De la même façon,
    int i = 0
    char *p = (void *)i;
    n'est pas forcèment un null pointer.

    > 100%
    Non. pour varargs, ça ne marche pas.
    Heureusement, gcc a la délicatesse de le dire :
    printf("%p\n", 0) ;
    test.c:3: attention : l'argument de format n'est pas un pointeur (arg 2)

    oui, gcc inspecte les chaîne de format pour faire la véréfication des types, c'est gentil de sa part.

    avec :
    fprintf("%p\n", NULL) ;
    Pas de warning, c'est correct.


    Parce que:
    1) sur ta plateforme NULL est défini par '(void *)0'
    2) la fonction attend un void * (à cause du %p)

    Mais:
    1) si tu compiles ça sur une autre implémentation avec NULL défini à 0 (ce qui est légal dixit la norme), ça va pas marcher
    2) pour une vararg attendant un type (toto *), il faut caster le NULL de toutes façons, même s'il est défini par (void *)0 car il se peut que:
    sizeof(toto *) != sizeof (void *)