La taille des pointeurs (et ce jusqu'au niveau des registres qui les stoquent) peut varier en fonction du contexte CPU.
C'est pas le problème. Ça c'est la cuisine interne du compilateur, dépendant de la plateforme : ça ne se voit pas au niveau du source.
Effectivement l'adresse 0 peut être valable, c'est pourquoi la norme parle de 'null pointer constant', ie une syntaxe spéciale pour désigner une adresse invalide. Cette syntaxe est 0 ou (void *)0 (quelle que soit la plateforme). La norme dit ensuite que si on convertit ça en un type pointeur, par exemple en faisant char *p = 0; ou char *p = NULL;, le compilo doit remplacer ça par une adresse invalide pour la plateforme.
Le problème avec les vararg (ou avec une fonction sans prototype) est que la 'null pointer constant' ne va pas forcèment être convertie en un type pointeur à cause des règles de promotion.
De toutes façons, ça n'est pas l'argument de Linus :) Son problème, c'est que la syntaxe spéciale 0 pour désigner un pointeur invalide est débile : un pointeur n'est pas un entier, il veut une syntaxe qui montre bien qu'on a affaire à un pointeur. Il veut voir NULL partout pour des raisons de style.
[^] # Re: Petites precisions
Posté par Vivi . En réponse au journal J'adore Linus. Évalué à 6.
C'est pas le problème. Ça c'est la cuisine interne du compilateur, dépendant de la plateforme : ça ne se voit pas au niveau du source.
Effectivement l'adresse 0 peut être valable, c'est pourquoi la norme parle de 'null pointer constant', ie une syntaxe spéciale pour désigner une adresse invalide. Cette syntaxe est 0 ou (void *)0 (quelle que soit la plateforme). La norme dit ensuite que si on convertit ça en un type pointeur, par exemple en faisant char *p = 0; ou char *p = NULL;, le compilo doit remplacer ça par une adresse invalide pour la plateforme.
Le problème avec les vararg (ou avec une fonction sans prototype) est que la 'null pointer constant' ne va pas forcèment être convertie en un type pointeur à cause des règles de promotion.
De toutes façons, ça n'est pas l'argument de Linus :) Son problème, c'est que la syntaxe spéciale 0 pour désigner un pointeur invalide est débile : un pointeur n'est pas un entier, il veut une syntaxe qui montre bien qu'on a affaire à un pointeur. Il veut voir NULL partout pour des raisons de style.