Agregar un puntero a una cadena en C++
Pregunta
Estoy confundido con los punteros constantes en C++ y escribí una pequeña aplicación para ver cuál sería el resultado.Estoy intentando (creo) agregar un puntero a una cadena, lo cual no debería funcionar correctamente, pero cuando ejecuto el programa obtengo correctamente "hola mundo".¿Alguien puede ayudarme a descubrir cómo funciona esta línea (s += s2)?
Mi código:
#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;
}
Solución
La variable s
es local dentro del append
función.Una vez el append
La función devuelve que la variable se destruye, dejándote con un puntero a una cadena que ya no existe.El uso de este puntero conduce a comportamiento indefinido.
Mi consejo para ti sobre cómo resolver esto:Usar std::string
¡hasta el final!
Otros consejos
estas agregando const char*
puntero a un std::string
y eso es posible (ver esta referencia).no sería posible hacer esa operación en char*
tipo (cadena de estilo C).
sin embargo, estás devolviendo un puntero a la variable local, por lo que una vez que funcione append
regresa y sale de la pila, la cadena a la que apunta el puntero devuelto no existiría.esto conduce a un comportamiento indefinido.
La clase std::string se ha sobrecargado operator +=
para un operando de tipo const char *
basic_string& operator+=(const charT* s);
De hecho, simplemente agrega la cadena a la que apunta este puntero al contenido del objeto de tipo std::string asignando memoria adicional si es necesario.Por ejemplo, internamente, el operador sobrecargado podría usar la función C estándar strcat
Conceptualmente es similar al siguiente fragmento de código.
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
Tenga en cuenta que su programa tiene un comportamiento indefinido porque total
no será válido después de destruir los objetos locales después de salir de la función anexar.Así que la siguiente declaración en main
printf("%s", total);
puede dar lugar a un comportamiento indefinido.