2012-11-03 4 views
0

J'essaye de construire une fonction qui compacte la fonction de sprintf, mais j'ai rencontré le problème suivant:C++ char tableau de corruption?

La première ligne après avoir appelé la classe (C'était une fonction, mais cela n'a pas fonctionné soit) je reçois le résultat correct: http://puu.sh/1m1Bw

Mais la ligne après que je reçois quelque chose de complètement différent, alors que je ne touche même pas la classe ou la variable: http://puu.sh/1m1BR

quelqu'un peut-il me expliquer ce qui se passe ici?

Edit: Vous avez oublié la classe réelle:

StringCreator::StringCreator(char* _parten, ...) { 
     char buff[255]; 

     va_list args; 
     va_start (args, _parten); 
     vsprintf (buff,_parten, args); 
     va_end(args); 

     this->str = buff; 
    } 

Et dans le fichier .h:

class StringCreator { 
public: 
    StringCreator(char* _parten, ...); 
    char* str; 
}; 
+3

Non. Il est impossible d'expliquer ce qui se passe à moins que vous nous montriez le code ... – Jasper

+3

Vous avez une erreur dans votre code. –

+0

Oow shoot, fotgot la classe: \t StringCreator :: StringCreator (char * _parten, ...) { \t \t char buff [255]; \t \t va_list args; \t \t va_start (args, _parten); \t \t vsprintf (buff, _parten, args); \t \t va_end (args); \t \t this-> str = buff; \t} – Thijs

Répondre

2

Après le constructeur StringCreator() terminé la variable membre this->str est un pointeur ballants comme il pointe à buff qui est une variable locale du constructeur. L'accès this->str après le constructeur est un comportement indéfini. Changement str d'un char* à un std::string est une solution et si vous avez besoin d'accéder à un const char* vous pouvez utiliser str.c_str(). L'utilisation d'un std::string signifie également que le constructeur de copie par défaut et l'opérateur d'affectation sont corrects.

Si, comme il est indiqué dans le commentaire de cette réponse, vous new char[255] au lieu d'utiliser un std::string, alors vous devez soit faire StringCreator non copiable ou mettre en œuvre un constructeur de copie et opérateur d'affectation qui copie le contenu de str. Voir What is The Rule of Three? Alternativement, vous pourriez avoir char str[255]; et éviter l'allocation dynamique et la copie par défaut de StringCreator serait correcte.

Pour éviter un dépassement de tampon potentiel sur l'appel à vsprintf(), utilisez vsnprintf() à la place (si votre compilateur prend en charge C99) qui accepte comme argument la taille du tampon chargé et n'écrit pas plus que la taille spécifiée.

+0

Bien sûr! Je vous remercie! Changement à: 'code' \t StringCreator :: StringCreator (char * _parten, ...) { \t \t str = nouveau caractère [255]; \t \t va_list args; \t \t va_start (args, _parten); \t \t vsprintf (str, _parten, args); \t \t va_end (args); \t} – Thijs