Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
Archive de la liste aide - [Aide] C, define, char * et optimisation
Bonjour,

c'est parce que tu confond l'adresse du pointeur et l'adresse pointée par celui-ci.

VAL est un pointeur sur la chaîne "value"
le pointeur se trouve à l'adresse 0x400678. A cette adresse se trouve l'adresse de la chaîne value (mettons 0x888888)
var est un autre pointeur, mais qui pointe vers la même zone
le pointeur se trouve donc à l'adresse 0x7fffa7485948 et contient l'adresse de la chaîne value (0x888888)

Lors de la comparaison, comme tu n'utilises pas strcmp, ce sont les valeurs de VAL et var qui sont comparées, or toutes les deux ont la même valeur 0x888888 qui est l'adresse de la chaîne "value", d'où le retour OK

Lors de ton deuxième print, ce qu'il faut afficher n'est pas &var et &VAL car l'adresse de ces deux données est bien distincte, mais l'adresse pointée par chacune de ces données (int)var, (int)VAL, qui doit te donner 0x888888 dans l'exemple ci-dessus


Cordialement,

Antoine HUMBERT

----- Mail original -----
De: linuxprocess at free.fr
À: "Liste d'entraide du site http://www.lea-linux.org" <aide at lea-linux.org>
Envoyé: Mardi 11 Juin 2013 22:35:26
Objet: [Aide] C, define, char * et optimisation

Bonjour Lea,

Ca fait longtemps que je ne t'ai pas posé de colle en C ...
Mais en voici une que je viens de rencontrer, et pour laquelle je ne trouve pas d'explication ...

Si l'on considère ce petit programme :

#include <stdio.h>
#define VAL "value"
void main(void)
{
        char * var = "value";

        if(var == VAL)
                printf("OK\n");
        else
                printf("KO ...\n");
}

On aura comme résultat à l'exécution "OK" !
Hé oui, le test "var == VAL" ne compare pas le contenu des chaines, mais directement les adresses des chaines.
Or comme var et VAL sont tous deux des constantes, le compilateur optimise en les stockant au même endroit.

D'ailleurs, si on liste les chaines dans l'exécutable avec la commande "strings", ca donne bien une seule occurrence de "value".


Sauf que ... bin justement si on affiche les adresses ... elles sont différentes !!
On rajoute à la fin du programme :
        printf("%s VS %s (%p vs %p)\n",var, VAL, &var, &VAL);

Et j'obtiens :
OK
value VS value (0x7fffa7485948 vs 0x400678)

Quelqu'un aurait une explication ?

Merci
_______________________________________________
Aide mailing list
Aide at lea-linux.org
http://lists.lea-linux.org/cgi-bin/mailman/listinfo/aide

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons