Renvoi d'un pointeur sur une variable automatique

Renvoi d'un pointeur sur une variable automatique - C - Programmation

Marsh Posté le 15-11-2010 à 18:55:13    

Bonjour,
 
J'ai un problème pour une fonction qui renvoie un pointeur sur une variable automatique.
Le 1er code que j'utilisais est le suivant mais il ne fonctionne pas car ma variable chaine est détruite lors de la sortie.

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. char *init_chaine(void)
  6. {
  7.     char chaine[10], *p;
  8.     p = chaine; // Initialisation du pointeur
  9.     strcpy(chaine,"Salut" ); // Remplit la chaine
  10.    
  11.     return p; // Retourne un pointeur sur la chaîne
  12. } // Sortie de la fonction => Destruction des variables locales
  13. int main(void)
  14. {
  15.     char *p;
  16.     p = init_chaine(); // On croit mettre "Salut" dans la chaine
  17.     printf ("%s \n", p); // SURPRISE
  18. }


 
Je travaille sur micro contrôleur et je n'ai pas accès à l'allocation dynamique (malloc). J'utilise donc une variable globale pour ma chaine mais le pointeur retourné est local.
Cela vous parait-il bon ?
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. char chaine[10] // chaine est maintenant globale
  6. char *init_chaine(void)
  7. {
  8.      char *p;
  9.     p = chaine; // Initialisation du pointeur
  10.     strcpy(chaine,"Salut" ); // Remplit la chaine
  11.    
  12.     return p; // Retourne un pointeur sur la chaîne
  13. }
  14. int main(void)
  15. {
  16.     char *p;
  17.     p = init_chaine();
  18.     printf ("%s \n", p);
  19. }


 
Merci d'avance.

Reply

Marsh Posté le 15-11-2010 à 18:55:13   

Reply

Marsh Posté le 15-11-2010 à 19:02:39    

Moui, c'est correct écrit de la sorte. Faut quand même faire attention, parce que si tu appelles une deuxième fois la fonction init_chaine(), le buffer de ton premier appel va être écrasé (ce qui n'est pas toujours évident à garantir, surtout lorsque les appels de fonctions sont imbriqués sur un paquet de niveau).
 
Pour une meilleure encapsulation, je te conseillerais d'utiliser des variables statiques :
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. char *init_chaine(void)
  6. {
  7.     static char chaine[10] // chaine est maintenant globale
  8.  
  9.     return strcpy(chaine,"Salut" ); // Remplit la chaine
  10. }
  11.  
  12. int main(void)
  13. {
  14.    char *p;
  15.  
  16.    p = init_chaine();
  17.    printf ("%s \n", p);
  18. }


Reply

Marsh Posté le 15-11-2010 à 23:19:16    

Citation :

Pour une meilleure encapsulation, je te conseillerais d'utiliser des variables statiques

Pareil.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-11-2010 à 10:10:11    

Merci de votre aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed