Adicionar um ponteiro para uma seqüência de caracteres em C++
Pergunta
Estou confuso com const ponteiros em C++, e escreveu um pequeno aplicativo para ver de que a saída seria.Eu estou tentando (eu acredito) para adicionar um ponteiro para uma seqüência de caracteres, que deve não funcionar corretamente, mas quando eu executar o programa corretamente get "olá mundo".Alguém pode me ajudar a descobrir o que como esta linha (s += s2) está trabalhando?
O meu 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;
}
Solução
A variável s
é o local dentro do append
função.Uma vez que o append
a função retorna essa variável é destruída, deixando-o com um ponteiro para uma seqüência de caracteres que não existe mais.Usando esse ponteiro leva a comportamento indefinido.
Minha dica para você de como resolver isso:Utilização std::string
todo o caminho!
Outras dicas
você está adicionando const char*
ponteiro para um std::string
e o que é possível (ver essa referência).não seria possível fazer essa operação em char*
tipo (C cadeia de estilo).
no entanto, você está retornando um ponteiro para uma variável local, uma vez que a função append
retorna e fica estalado da pilha, a seqüência de caracteres que o ponteiro retornado está apontando para não existiria.isto leva a um comportamento indefinido.
Classe std::string tem sobrecarregado operator +=
para um operando do tipo const char *
basic_string& operator+=(const charT* s);
Na verdade, ele simplesmente acrescenta a cadeia de caracteres apontada por este ponteiro para o conteúdo do objeto do tipo std::string alocação de additionly de memória, se necessário.Por exemplo, internamente, o operador sobrecarregado pode usar a função padrão de C strcat
Conceitualmente é semelhante à seguinte trecho de código.
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
Levar em conta que seu programa tem indefinido comportamento total
será inválido depois de destruir local objeto s depois de sair da função de acréscimo.Assim, a próxima statemnent principal
printf("%s", total);
pode resultar em comportamento indefinido.