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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top