Historique de la question : Dans le langage C, les pointeurs sont des variables qui contiennent les adresses d'autres objets. Un problème est apparu : comment comparer de telles valeurs, car la mémoire peut être allouée de manière très imprévisible. Le langage autorise l'opération de comparaison entre pointeurs, mais impose un certain nombre de restrictions afin que le comportement reste déterminé.
Problème : Il est correct de comparer uniquement les pointeurs vers des éléments du même tableau ou vers le même objet. La comparaison de pointeurs pointant vers des objets non liés (différentes variables ou zones de mémoire allouées, ne faisant pas partie du même tableau) constitue un comportement indéfini.
Solution : Il faut éviter de comparer des pointeurs entre des zones de mémoire non liées, les utiliser seulement dans un même tableau/chaîne/tampon, et la comparaison avec NULL est toujours sécurisée.
Exemple de code :
#include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p1 = &arr[1]; int *p2 = &arr[3]; if (p1 < p2) { printf("p1 pointe vers un élément plus ancien du tableau que p2\n"); } }
Caractéristiques clés :
1. Peut-on comparer des pointeurs obtenus via malloc et pointant vers différents blocs de mémoire ?
Non, on ne peut pas comparer de tels pointeurs — le comportement n'est pas défini par la norme. On ne peut comparer que des pointeurs vers le même bloc de mémoire alloué ou avec NULL.
2. Que retourne la comparaison de pointeurs de type int et double, s'ils pointent vers différentes variables, mais ont la même valeur numérique ?**
La comparaison n'est possible que si les deux pointeurs sont castés au même type et pointent vers le même objet. Si ce n'est pas le cas, le résultat n'est pas défini — les valeurs des adresses peuvent être identiques, mais la norme ne garantit pas ce comportement.
3. Est-il correct de comparer un pointeur vers le premier élément d'un tableau avec un pointeur vers sa fin (par exemple, arr et arr + N) ?
Oui, c'est correct. arr + N pointe vers un élément imaginaire suivant le dernier, et le compilateur garantit que arr <= arr + N.
Un employé a décidé de mettre en œuvre une fonction de comparaison d'adresses pour déterminer "lequel a été créé en premier" entre deux structures allouées à partir de blocs de mémoire différents.
Avantages :
Inconvénients :
Après révision, une vérification de l'appartenance des pointeurs à un même bloc de mémoire a été mise en œuvre en allouant toutes les structures dans un tampon commun et en comparant ensuite dans des limites acceptables.
Avantages :
Inconvénients :