Posté par 007 .
En réponse au journal J'adore Linus.
Évalué à 7.
Certe pour le CPU et toussa.
Mais :
p = 0 ; p++
c'est pas la même chose si p est un int ou un int *.
Si c'est un int alors p = 1. Si c'est un (int *) alors p = 4 (si sizeof(int) = 4).
Puis si p n'est pas un int, on passe à côté de toute l'arthémitique des pointeurs.
p[3] n'a aucun sens si p est un int.
Que l'adresse 0 soit valide ne change rien.
i = 0 // initialisation avec un int
i= (void *)0 // initialisation avec un pointeur (pour faire un reset :-))
i = NULL // initialisation avec un pointeur invalide
La norme ne dit pas que NULL est l'adresse 0. Le norme indique uniquement que c'est une adresse invalide en C.
De même si tu lis la norme posix, on a souvent :
- return NULL if ....
Mais pas
- return 0 if ...
Donc il faut toujours faire les tests avec (p == NULL).
Dans les bonnes règles de programmation ont rappèle toujours qu'il ne faut pas considérer qu'un pointeur est un entier.
J'ai bossé sur Digital Unix et j'ai :
sizeof(int) = 4
sizeof(void *) = 8
De même il ne faut jamais utiliser de int pour la différence de pointeur. Il faut utiliser le type ptr_diff.
Ce sont des règles de basse. sinon c'est la galère pour porter une appli dans un environnement 64 bits.
Je suis absolument d'accord avec Linus, il faut banir le '0' pour les pointeurs. Peut-être qu'un jour les compilateurs mettrons un gros warning lorsqu'un pointeur est initialisé avec un int. Car c'est fondamentalement une erreur. Les int et les pointeurs n'ont rien à voir.
[^] # Re: Petites precisions
Posté par 007 . En réponse au journal J'adore Linus. Évalué à 7.
Mais :
p = 0 ; p++
c'est pas la même chose si p est un int ou un int *.
Si c'est un int alors p = 1. Si c'est un (int *) alors p = 4 (si sizeof(int) = 4).
Puis si p n'est pas un int, on passe à côté de toute l'arthémitique des pointeurs.
p[3] n'a aucun sens si p est un int.
Que l'adresse 0 soit valide ne change rien.
i = 0 // initialisation avec un int
i= (void *)0 // initialisation avec un pointeur (pour faire un reset :-))
i = NULL // initialisation avec un pointeur invalide
La norme ne dit pas que NULL est l'adresse 0. Le norme indique uniquement que c'est une adresse invalide en C.
De même si tu lis la norme posix, on a souvent :
- return NULL if ....
Mais pas
- return 0 if ...
Donc il faut toujours faire les tests avec (p == NULL).
Dans les bonnes règles de programmation ont rappèle toujours qu'il ne faut pas considérer qu'un pointeur est un entier.
J'ai bossé sur Digital Unix et j'ai :
sizeof(int) = 4
sizeof(void *) = 8
De même il ne faut jamais utiliser de int pour la différence de pointeur. Il faut utiliser le type ptr_diff.
Ce sont des règles de basse. sinon c'est la galère pour porter une appli dans un environnement 64 bits.
Je suis absolument d'accord avec Linus, il faut banir le '0' pour les pointeurs. Peut-être qu'un jour les compilateurs mettrons un gros warning lorsqu'un pointeur est initialisé avec un int. Car c'est fondamentalement une erreur. Les int et les pointeurs n'ont rien à voir.