2011-02-02 3 views
1

Je réalise que ce code est défectueux. Cependant, je suis tombé sur un comportement curieux que je me demandais si quelqu'un pouvait expliquer.comportement curieux de scanf

Exemple 1:

char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

sortie est le suivant: (null).

Exemple 2:

int i; 
    char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

sortie est: val de foo!

Pourquoi la présence de int i provoquerait-elle le "travail"?

+2

Cela ne fonctionne pas. Il semble arriver à faire ce que vous attendez, mais c'est un comportement indéfini et donc un bug sérieux. – delnan

+1

D'après ce que vous avez posté, foo n'a aucune valeur. C'est un pointeur vers un morceau de mémoire non assigné. – SlappyTheFish

+0

Je suppose que ce serait assez ennuyeux trouvé ce genre de bug dans vos propres programmes. ;) – BlackBear

Répondre

6

foofoofoo est un pointeur, mais vous ne l'avez pas défini pour pointer sur la mémoire que vous avez allouée, donc il a juste une valeur aléatoire au démarrage, et pointe donc vers une section aléatoire de la mémoire. Par conséquent, tout peut arriver (c'est-à-dire comportement indéfini).

La présence de int i modifie simplement la position de foo sur la pile, et donc la valeur aléatoire particulière dont elle dispose. Vous ne devriez rien lire de significatif dans ce comportement différent, car il n'est pas encore défini.