Question

Je suis confus avec les pointeurs const en C++ et j'ai écrit une petite application pour voir quel serait le résultat.J'essaie (je crois) d'ajouter un pointeur sur une chaîne, ce qui ne devrait pas fonctionner correctement, mais lorsque j'exécute le programme, j'obtiens correctement "hello world".Quelqu'un peut-il m'aider à comprendre comment fonctionne cette ligne (s += s2) ?

Mon code :

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

const char* append(const char* s1, const char* s2){
    std::string s(s1);     //this will copy the characters in s1
    s += s2;               //add s and s2, store the result in s (shouldn't work?)
    return s.c_str();      //return result to be printed
}

int main() {
    const char* total = append("hello", "world");
    printf("%s", total);
    return 0;
}
Était-ce utile?

La solution

La variable s est local à l'intérieur du append fonction.Une fois la append La fonction renvoie cette variable détruite, vous laissant avec un pointeur vers une chaîne qui n'existe plus.L'utilisation de ce pointeur conduit à comportement indéfini.

Mon conseil pour résoudre ce problème :Utiliser std::string tout le!

Autres conseils

tu ajoutes const char* pointeur vers un std::string et c'est possible (voir cette référence).il ne serait pas possible d'effectuer cette opération sur char* tapez (chaîne de style C).

cependant, vous renvoyez un pointeur vers une variable locale, donc une fois la fonction append renvoie et est extrait de la pile, la chaîne vers laquelle pointe votre pointeur renvoyé n'existerait pas.cela conduit à un comportement indéfini.

La classe std :: string est surchargée operator += pour un opérande de type const char *

basic_string& operator+=(const charT* s);

En fait, il ajoute simplement la chaîne pointée par ce pointeur au contenu de l'objet de type std::string en allouant de la mémoire supplémentaire si nécessaire.Par exemple, en interne, l'opérateur surchargé pourrait utiliser la fonction C standard strcatConceptuellement, il est similaire à l'extrait de code suivant.

char s[12] = "Hello ";
const char *s2 = "World";

std::strcat( s, s2 );

Tenez compte du fait que votre programme a un comportement indéfini car total sera invalide après avoir détruit les objets locaux après avoir quitté la fonction append.Donc la prochaine déclaration principale

printf("%s", total);

peut entraîner un comportement indéfini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top