2010-06-15 3 views
5
char *myfunc() { 
    char *temp = "string"; 
    return temp; 
} 

Dans cette partie du code, où se passe l'allocation de l'objet pointé par temp et quelle serait sa portée?Attribution d'objets en C++

Cette fonction est-elle une méthode valide pour renvoyer un pointeur char *?

+2

Est-ce ce devoir? –

+1

@Dirk Eddelbuettel: non. – Moeb

Répondre

13

Le code est-il correct?

Oui, votre code est (presque) correct, car "string" est un littéral de chaîne situé dans le stockage statique.

Remarque: Un pointeur est simplement une variable qui stocke une adresse de mémoire. Cette ligne stocke simplement l'adresse de la chaîne littérale "chaîne" à l'intérieur d'une variable appelée temp. La norme C++ garantit que la chaîne littérale restera en mémoire pendant toute la durée du programme tel que défini ci-dessous. Ce qui signifie que vous êtes libre d'utiliser cette adresse mémoire dans n'importe quel contexte, pendant toute la durée de vie de votre programme.


Pourquoi?

La norme 03 C++ (actuel) a ceci à dire:

Une chaîne ordinaire est de type littéral « réseau de n const char » et la durée statique de stockage (3,7),

et section 3.7.1 - 1:

Tous les objets qui n'ont de stockage dynamique La durée de stockage statique n'est pas . Le stockage pour ces objets doit durer pendant la durée du programme.


Attention:

Dans votre code, vous retournez un char*, vous devriez vraiment être un const char * retournerez. C'est un comportement indéfini si vous essayez de modifier un littéral de chaîne, et votre valeur de retour de fonction ne doit pas prétendre l'autoriser.

Sur une note relative à l'avertissement. Si vous avez dans votre code à 2 endroits différents une chaîne appelée "string" alors que ce soit ou non des chaînes distinctes est implémentée.

+0

Merci Brian! – Moeb

6

Ce code fonctionne (et est correct) car l'objet "chaîne" est une donnée statique, qui est "allouée" (pour ainsi dire) pendant la compilation - l'éditeur de liens la place dans une section spéciale de l'exécutable.

Mais C++ conforme aux normes devrait dire const char* au lieu de char* en se référant à des données statiques.

+0

Ce n'est pas une exigence de la norme. Le code de Poiuyt est entièrement légal. C'est un meilleur/practice/d'utiliser char const * au lieu de char * mais la norme ne l'exige pas. –

+2

@Noah: Il s'agit d'un comportement indéfini si vous modifiez cette chaîne littérale. –

+0

@EFraim, @Brian R. Bondy, @Noah Roberts: Pourquoi '' string ''n'est pas local à' myfunc() '? – Moeb

3

Comme cela a été mentionné, il est alloué au moment de la compilation; c'est un littéral.

Mais en C++ c'est pas aussi valide que possible parce que le pointeur ne pointe pas vers const char. En général, c'est quelque chose que vous devriez envisager de faire d'une manière très différente.

+0

+1 pour signaler le problème 'const'. – Void

Questions connexes