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 *)
[^] # Re: Petites precisions
Posté par Vivi . En réponse au journal J'adore Linus. Évalué à 1.
> p est un null pointer
Non, c'est initialisé à 0.
Si, section 6.5.8 'Initialization', paragraphe #10 : 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 *)