Pergunta

Olá pessoal, estou tentando descobrir como os ponteiros são retornados por strcat(), então tentei implementar meu próprio strcat() para ver como funciona.A seguir está meu código para mystrcat(), que funciona como o strcat() real:

char *mystrcat(char *destination, char *source)
{
    char *str = destination;

    while (*str != '\0')
    {
        str++;
    }

    while (*source != '\0')
    {
        *str = *source;
        str++;
        source++;
    }
    *str = '\0';

    return str;
}

Então, digamos que no meu main(), eu tenho

char string[BUFSIZ];
mystrcat(string, "hello");
printf("%s\n", string);

A saída seria

hello

como esperado.O que não entendo é como retornar o endereço da variável local, str, faria magicamente a variável, string, apontar para ela e também por que a variável, str, não é excluída quando a função termina.

Foi útil?

Solução

Você não está retornando o endereço da variável local.Você está devolvendo o valor da variável local.Como a variável em questão é um ponteiro, seu valor passa a ser um endereço.O endereço que está contido no str variável aponta para o bloco de memória fornecido pelo argumento destination.

O que você parece estar entendendo mal é que isto:

char* str = destination;

Não cria uma cópia do destination corda.Ele cria um ponteiro chamado str que aponta para o mesmo local de memória que destination aponta para.Quando você usa str para manipular os caracteres nesse bloco de memória, a string representada por destination também é modificado, porque str e destination apontar para o exatamente a mesma sequência de caracteres em memória.É assim que ele "atualiza magicamente" o parâmetro.

Outras dicas

str é um ponteiro para a string que você passa (destino), então você está modificando sua variável original string de dentro do seu strcat função.

O ponteiro str é excluído no final da rotina, mas não é mais necessário.

BTW, é confuso usar a palavra "string" como o nome de uma variável, porque muitos idiomas se reservam string como uma palavra -chave.

A primeira linha da função, você está atribuindo *str como o mesmo que *destino. Com efeito, quando você retorna, você está retornando *destino, o mesmo que *str.

Nenhuma memória é alocada, portanto, nenhuma memória deve ser excluída.

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