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.

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top