我昨天开始学习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
的实施引起的吗?或者是否有类似最小数组长度的东西?还是我犯了一个愚蠢的初学者的错误?
提前致谢。
答案 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;
}