Como funciona o retorno do ponteiro em strcat()
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.
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.