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;
}
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top