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;
}
¿Fue útil?

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 strcatConceptualmente 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top