Aggiunta di un puntatore a una stringa in C ++
Domanda
Sono confuso con i puntatori cost in C ++ e ha scritto una piccola applicazione per vedere cosa sarebbe l'uscita.Sto tentando (credo) per aggiungere un puntatore a una stringa, che non dovrebbe funzionare correttamente, ma quando eseguo il programma, ottengo correttamente "Hello World".Qualcuno può aiutarmi a capire cosa funziona questa linea (s += s2)?
Il mio codice:
#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;
}
. Soluzione
La variabile s
è locale all'interno della funzione append
.Una volta che la funzione append
restituisce quella variabile è distrutta, lasciandoti con un puntatore a una stringa che non esiste più.L'utilizzo di questo puntatore porta a comportamento indefinito .
Il mio suggerimento su come risolvere questo: usa std::string
Tutto ilVia!
Altri suggerimenti
Stai aggiungendo il puntatore const char*
a un std::string
ed è possibile (vedere questoRiferimento ).Non sarebbe possibile effettuare quel funzionamento su char*
Type (C Style Style String).
Tuttavia, stai restituendo un puntatore alla variabile locale, quindi una volta la funzione append
restituisce e viene spuntata dello stack, la stringa che il puntatore restituito sta puntando a non esistere.Questo porta a un comportamento indefinito.
Classe STD :: String ha sovraccaricato operator +=
per un operando di tipo const char *
basic_string& operator+=(const charT* s);
.
In effetti aggiunge semplicemente la stringa da questo puntatore al contenuto dell'oggetto di tipo STD :: String Assegnazione della memoria aggiuntiva se necessario.Ad esempio, internamente l'operatore sovraccaricato potrebbe utilizzare la funzione C standard strcat
Concettualmente è simile al seguente snippet di codice.
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
.
Tieni conto del fatto che il programma non abbia un comportamento indefinito perché total
non sarà valido dopo aver distrutto l'oggetto locale dopo l'uscita dell'appendi.Quindi il prossimo stabilente in Principale
printf("%s", total);
.
può causare un comportamento indefinito.