为什么';strcat实现是否会导致分段错误?
我正在尝试学习C语言,并尝试了《C编程语言》一书中的练习,其中我实现了为什么';strcat实现是否会导致分段错误?,c,C,我正在尝试学习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[] = "Hell
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
位置的内容不是我初始化x
时请求的存储的一部分时,如何允许将t
位置的内容写入s
所指的位置
如果我像下面那样调用了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
的存储是固定的,而第一种存储不是固定的。所以,我觉得分割错误应该发生在后一种情况,而不是前一种情况
感谢您的澄清。这是未定义的行为。任何事情都有可能发生 第一个程序工作的实际原因是第一个程序中的字符串存储在堆栈上。它会覆盖堆栈,这会导致未定义的行为,但“仅起作用”,这是不幸的 第二个程序无法“工作”,因为字符串存储在只读内存中。任何写入这些字符串的尝试都将导致未定义的行为(或segfault)
strcat
的实现是有效的,您只需要为尝试附加到的字符串分配足够的空间
因此,总结一下:
当t
位置的内容不是我初始化x
时请求的存储的一部分时,如何允许将t
位置的内容写入s
所指的位置
不是。这是只发生在“工作”上的未定义行为。此外,未定义的行为不会自动导致分段错误。有一种可能性是,由于这两个数组靠得太近,您只需覆盖第二个数组,它就不会崩溃。我敢打赌,如果您尝试
put(y)
它将打印“orld”,在这两种情况下,分配给x
的存储在编译期间都是固定的。为“foo”
分配的存储也是固定的。但是在char*x=“foo”
中,指针指向只读内存(因为“foo”
是一个字符串文字),因此当您尝试写入时程序崩溃。@FedericoklezCulloca您称之为:)