1

我昨天开始学习 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(或带有 \0 的 7)
“ipsum!” - 大小 6(或带有 \0 的 7)
“Lorem ipsum!” - 12 号(或 13 号带 \0)

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

提前致谢。

4

3 回答 3

3

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

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

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

始终确保缓冲区中有足够的存储空间,C 中很少有工具可以保证安全行为,所以不要假设诸如minimum array length.

于 2013-08-21T08:27:49.413 回答
3

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

你不能知道。这就是“未定义的行为”。不明确的。

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

于 2013-08-21T08:28:44.870 回答
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;
}
于 2013-08-21T09:00:54.223 回答