Comment le retour du travail de pointeur dans strcat ()
Question
Hé les gars, je suis à essayer de comprendre comment les pointeurs sont renvoyés par strcat (), donc j'ai essayé de mettre en œuvre ma propre strcat () pour voir comment cela fonctionne. Ce qui suit est mon code pour mystrcat (), qui fonctionne comme le vrai strcat ():
char *mystrcat(char *destination, char *source)
{
char *str = destination;
while (*str != '\0')
{
str++;
}
while (*source != '\0')
{
*str = *source;
str++;
source++;
}
*str = '\0';
return str;
}
Alors disons que dans ma main (), je
char string[BUFSIZ];
mystrcat(string, "hello");
printf("%s\n", string);
La sortie serait
hello
comme prévu. Ce que je ne comprends pas comment retourner l'adresse de la variable locale, str, serait magiquement faire la variable, chaîne, pointez et aussi pourquoi la variable, str, pas supprimé lorsque la fonction se termine.
La solution
Vous ne retournez pas l'adresse de la variable locale. Vous retournez la valeur de la variable locale. Étant donné que la variable en question est un pointeur, sa valeur se trouve être une adresse. L'adresse qui est contenue dans les points de variables de str
dans le bloc de mémoire fourni par le destination
argument.
Ce que vous semblez être malentendu est que ceci:
char* str = destination;
ne crée pas une copie de la chaîne de destination
. Il crée un pointeur appelé str
que les points au même emplacement de mémoire que les points de destination
à. Lorsque vous utilisez str
pour manipuler les caractères dans ce bloc de mémoire, la chaîne représentée par destination
est également modifié, car str
et le point de destination
dans la exactement la même chaîne de caractères dans la mémoire. Voilà comment ça « mises à jour par magie » le paramètre.
Autres conseils
str
est un pointeur sur la chaîne que vous passez (destination), de sorte que vous modifiez votre string
variable d'origine à partir de votre fonction strcat
.
Le str
pointeur ne sont supprimés à la fin de la routine, mais il est plus nécessaire.
BTW, il est source de confusion pour utiliser le mot « chaîne » comme le nom d'une variable, parce que de nombreuses langues se réservent string
comme mot-clé.
La première ligne de la fonction, vous affectez * str être le même que destination *. En effet, lorsque vous revenez, vous revenez destination *, qui est le même que * str.
Pas de mémoire est allouée, donc pas de mémoire doit être supprimé.