我正在尝试学习C,并且在“ C编程语言”一书中尝试了该练习,在其中实现了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这是array的最后一个元素x。
然后在该行中while (*s++ = *t++);,我将设置s为数组外部的下一个内存块的地址,x并将其内容复制t到该新位置。如何将内容中的内容写入到初始化时不要求的存储中所t指向的位置?sx
如果我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是有效的,您只需要为要附加到的字符串分配足够的空间。
因此,回顾一下:
如何将内容中的内容写入到初始化时不要求的存储中所t指向的位置?sx
不是。这是仅发生在“工作”上的不确定行为。
#https://stackoverflow.com/questions/59091906/why-doesnt-the-strcat-implementation-cause-a-segmentation-fault