0

嘿伙计们,我想弄清楚 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没有被删除。

4

3 回答 3

1

您没有返回局部变量的地址。您正在返回局部变量的。由于所讨论的变量是一个指针,它的值恰好是一个地址。变量中包含的地址str指向参数提供的内存块destination

您似乎误解的是:

char* str = destination;

不创建destination字符串的副本。它创建了一个指针,该指针指向指向str的相同内存位置destination。当您str用来操作该内存块中的字符时,由 表示的字符串destination也会被修改,因为strdestination指向内存中完全相同的字符串。这就是它“神奇地更新”参数的方式。

于 2010-09-30T18:22:46.157 回答
0

str是指向您传入的字符串(目标)的指针,因此您正在stringstrcat函数中修改原始变量。

指针str在例程结束时确实被删除,但不再需要它。

顺便说一句,将“字符串”一词用作变量的名称会令人困惑,因为许多语言都将其保留string为关键字。

于 2010-09-30T18:24:37.667 回答
0

函数的第一行,您将 *str 分配为与 *destination 相同。实际上,当您返回时,您将返回 *destination,它与 *str 相同。

没有分配内存,因此不必删除任何内存。

于 2010-09-30T18:24:59.740 回答