开发者社区 问答 正文

为什么strcat实现不引起分段错误?

我正在尝试学习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是固定的,而首先是没有。因此,我觉得细分错误应该在后一种情况下发生,而不是前一种情况下发生?

谢谢您的澄清。

展开
收起
kun坤 2019-11-29 11:08:41 484 分享 版权
1 条回答
写回答
取消 提交回答
  • 这是未定义的行为。什么都可能发生。

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

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

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

    因此,回顾一下:

    如何将内容中的内容写入到初始化时不要求的存储中所t指向的位置?sx

    不是。这是仅发生在“工作”上的不确定行为。

    #https://stackoverflow.com/questions/59091906/why-doesnt-the-strcat-implementation-cause-a-segmentation-fault

    2019-11-29 11:10:13
    赞同 展开评论
问答分类:
问答地址: