[Aide] C, define, char * et optimisation

linuxprocess at free.fr linuxprocess at free.fr
Tue Jun 11 22:35:26 CEST 2013


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


More information about the Aide mailing list