gpt4 book ai didi

c - 为什么 strcat 实现不会导致段错误?

转载 作者:行者123 更新时间:2023-12-04 12:36:05 24 4
gpt4 key购买 nike

我正在尝试学习 C,我尝试了“The C Programming Language”一书中的练习,我在其中实现了 strcat() 函数,如下所示:

char *my_strcat(char *s, const char *t)
{
char *dest = s;

while (*s) s++;
while (*s++ = *t++);

return dest;
}

我这样调用它:

int main(int argc, char const *argv[])
{
char x[] = "Hello, ";
char y[] = "World!\n";

my_strcat(x, y);
puts(x);

return 0;
}

我的问题是,我不完全理解我自己的实现。

我的问题是在时间线 while (*s) s++; 完成后,现在我已经将保存在 s 中的地址设置为包含 的内存位置>\0 是数组 x 的最后一个元素。

然后在 while (*s++ = *t++); 行中,我将 s 设置为数组之外的下一个内存块的地址 x 并将 t 的内容复制到这个新位置。当 t 位置的内容不属于我初始化 时请求的存储的一部分时,如何允许将它写入 s 指向的位置x?

如果我像下面这样调用 my_strcat,我会得到一个段错误:

int main(int argc, char const *argv[])
{
char *x = "Hello, ";
char *y = "World!\n";

my_strcat(x, y);
puts(x);

return 0;
}

哪一种是有道理的。我的理解是 char *x = "foo"char x[] = "foo" 是一样的,区别在于后一种情况下,存储分配给 x 是固定的,而第一个不是。所以,我觉得段错误应该发生在后一种情况下,而不是前者?

感谢您的澄清。

最佳答案

这是未定义的行为。任何事情都有可能发生。

第一个程序运行的真正实际原因是第一个程序中的字符串存储在堆栈中。它会覆盖堆栈,这会导致未定义的行为,但不幸的是“正常工作”。

第二个程序不“工作”,因为字符串存储在只读存储器中。任何写入这些字符串的尝试都将导致未定义的行为(或段错误)。

您的 strcat 实现是有效的,您只需要为要附加到的字符串分配足够的空间。

所以,回顾一下:

How is it allowed to write the content at the location of t to the location pointed by s when it was not part of the storage I had requested when I initialized x?

不是。这是恰好“工作”的未定义行为。

关于c - 为什么 strcat 实现不会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59091906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com