[Aide] C, define, char * et optimisation

linuxprocess at free.fr linuxprocess at free.fr
Wed Jun 12 10:09:24 CEST 2013


Merci Antoine, 

Tu as mis le doigt sur ma coquille : les & dans l'affichage des pointeurs ...

Le programme corrigé :

#include <stdio.h>
#define VAL "value"
void main(void)
{
        char * var = "value";
        if(var == VAL)
                printf("OK\n");
        else
                printf("KO ...\n");
        printf("%s VS %s (%p vs %p)\n",var, VAL, var, VAL);
}

Qui donne le résultat attendu (me voilà rassuré) :

OK
value VS value (0x400688 vs 0x400688)

Pour ceux qui veulent creuser ces aspects, essayez ca :

#include <stdio.h>
#define VAL "value"
void main(void)
{
        char * var = "value";
        char vara[]="value";
        if(var == VAL)
                printf("OK\n");
        else
                printf("KO ...\n");
        printf("%s VS %s (%p vs %p)\n",var, VAL, var, VAL);

        if(vara == VAL)
                printf("OK\n");
        else
                printf("KO ...\n");
        printf("%s VS %s (%p vs %p)\n",vara, VAL, vara, VAL);
}
Donne :
OK
value VS value (0x400688 vs 0x400688)
KO ...
value VS value (0x7fff3dd209d0 vs 0x400688)

Car char* pointe sur une constante là ou char[] alloue un tableau modifiable.
On peut donc faire : vara[0]='r';
Mais pas : var[0]='r'; (core dumped)

A+


----- Mail original -----
De: "antoine humbert" <antoine.humbert at free.fr>
À: "Liste d'entraide du site http://www.lea-linux.org" <aide at lea-linux.org>
Envoyé: Mercredi 12 Juin 2013 09:04:24
Objet: Re: [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
_______________________________________________
Aide mailing list
Aide at lea-linux.org
http://lists.lea-linux.org/cgi-bin/mailman/listinfo/aide


More information about the Aide mailing list