Как работает возврат указателя в strcat () - PullRequest
0 голосов
/ 30 сентября 2010

Привет, ребята, я пытаюсь понять, как указатели возвращаются strcat (), поэтому я попытался реализовать свой собственный strcat (), чтобы посмотреть, как он работает. Вот мой код для mystrcat (), который работает как настоящий 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;
}

Так скажем, в моем main () у меня есть

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

Вывод будет

hello

как и ожидалось. Чего я не понимаю, так это то, как возвращение адреса локальной переменной str магическим образом заставляет переменную string указывать на нее, а также почему переменная str не удаляется при завершении функции.

Ответы [ 3 ]

1 голос
/ 30 сентября 2010

Вы не возвращаете адрес локальной переменной. Вы возвращаете значение локальной переменной. Поскольку рассматриваемая переменная является указателем, ее значением является адрес. Адрес, содержащийся в переменной str, указывает на блок памяти, предоставленный аргументом destination.

То, что вы, кажется, неправильно понимаете, таково:

char* str = destination;

Не создает копию строки destination. Он создает указатель с именем str, который указывает на ту же область памяти, на которую указывает destination. Когда вы используете str для манипулирования символами в этом блоке памяти, строка, представленная destination, также изменяется, поскольку str и destination указывают на точно такую ​​же строку символов в памяти , Вот так он «волшебным образом» обновляет параметр.

0 голосов
/ 30 сентября 2010

В первой строке функции вы назначаете * str таким же, как * destination. По сути, когда вы возвращаетесь, вы возвращаете * пункт назначения, который совпадает с * str.

Память не выделена, поэтому память не должна быть удалена.

0 голосов
/ 30 сентября 2010

str - это указатель на строку, которую вы передаете (пункт назначения), поэтому вы изменяете исходную переменную string из своей функции strcat.

Указатель str действительно удаляется в конце процедуры, но он больше не нужен.

Кстати, использование слова «строка» в качестве имени переменной сбивает с толку, поскольку многие языки резервируют string в качестве ключевого слова.

...