在小数组中连接两个字符串时出现段错误

时间:2013-08-21 08:19:13

标签: c segmentation-fault strcat

我昨天开始学习C,所以这可能是一个微不足道的问题,但我仍然没有得到这个。

假设我有以下代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char text[8];
    strcpy(text, "Lorem ");
    puts(text);
    strcat(text, "ipsum!");
    puts(text);
    return 0;
}

这会在连接字符串时(或之后)导致分段错误。但是,如果我将text的大小从8更改为9,则不会。

如果我错了,请纠正我,但这是我认为是对的:

“Lorem” - 大小6(或7与\ 0)
“存有!” - 大小6(或7与\ 0)
“Lorem ipsum!” - 大小12(或13与\ 0)

那么,8/9来自哪里?这是由strcat的实施引起的吗?或者是否有类似最小数组长度的东西?还是我犯了一个愚蠢的初学者的错误?

提前致谢。

3 个答案:

答案 0 :(得分:3)

幸运的是,它没有崩溃,至少在Linux上我得到*** stack smashing detected ***

您尝试将字符串附加到另一个字符串,即使后者的存储空间不足。这是一个未定义行为的例子(如评论中所指出的)。

C是一种始终信任程序员的程序语言,因此在编译时你甚至不会收到警告。

始终确保缓冲区中有足够的存储空间,C中很少有设施可以保证安全行为,因此不要假设minimum array length之类的内容。

答案 1 :(得分:3)

当您超出数组末尾时,程序具有未定义的行为。这意味着它可能会按照您的预期执行,也可能不执行。它可能会像您没有调用未定义的行为一样运行。它可能会崩溃。它可能会重新格式化您的硬盘驱动器。它可能会在您的打印机上打印一个空白页。它可能会完成所有这些操作,具体取决于您何时运行它。

你无法知道。这就是“未定义的行为”。未定义。

我可以给你一个行为的解释,但它没有用,而且非常硬件和具体实现。

答案 2 :(得分:0)

您可以将malloc设置为您想要的任何大小。甚至你也可以根据进一步的输入重新分配。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *text;
    text = (char *) malloc(sizeof(char) * 12);
    memset(text, 0x0, sizeof(char) * 12);
    sprintf(text, "%s", "Lorem ");
    puts(text);
    sprintf(text, "%s%s", text, "ipsum!");
    puts(text);
    return 0;
}