2017-04-13 2 views
-1
#include <string.h> 
#include <stdio.h> 

char *in() { 
    char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main() { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
} 

Répondre

3

Dans votre code,

return (a); 

est une tentative de renvoyer l'adresse d'une variable locale. Dans l'appelant, toute utilisation (tente d'accéder à) de l'adresse provoquera undefined behavior, car l'adresse de la mémoire est non valide. Après le retour de la fonction, les variables locales à l'intérieur de la fonction cesseront d'exister, leur durée de vie expirera. Ainsi, les adresses correspondant à ces variables (objets) deviennent invalides. Selon C11, chapitre §6.2.4

[...] Si un objet est appelé à l'extérieur de sa durée de vie, le comportement est indéfini. La valeur d'un pointeur devient indéterminée lorsque l'objet vers lequel il pointe (ou passe juste) atteint la fin de sa durée de vie.

Note: Cela dit, mon plus personnel ::return est un mot-clé, s'il vous plaît ne faites pas ressembler à une fonction.

Solution: Vous devez vous assurer que la durée de vie de la variable dont l'adresse est renvoyée, supplante la portée de la fonction, de sorte que vous pouvez soit

  • utilisation malloc() et sa famille pour allouer de la mémoire
  • utilisez une variable avec le stockage static.
+1

Au lieu de répondre à plusieurs reprises aux FAQ les plus courantes, pourquoi ne pas commencer à les fermer en tant que doublons? Cette question a 2 doublons canoniques: [pointeur vers variable locale] (http://stackoverflow.com/questions/4570366/pointer-to-local-variable) lorsque l'OP ne sait pas ce qu'ils font et La mémoire de la variable est-elle accessible en dehors de sa portée?] (http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its- scope) lorsque l'OP sait que c'est faux mais veut savoir pourquoi cela "semble fonctionner". – Lundin

0

Ne pas retourner le pointeur de variable locale. Utilisez global à la place ou statique.

char *in() { 
    static char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main() { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
}