Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';strcat实现是否会导致分段错误?_C - Fatal编程技术网

为什么';strcat实现是否会导致分段错误?

为什么';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

我正在尝试学习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
的内存位置,该位置是数组
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您称之为:)