我有以下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buffer[2];
strcpy(buffer, "12345678910");
printf("%s\n", buffer);
return 0;
}
因为,我已经定义了大小为2
的char数组,所以输入的数量不能超过2 char plus null terminating character
。但是,它所能承担的费用还不止于此,而没有任何缓冲区溢出或分段错误。即使我复制字符串strcpy(buffer, "123456789101298362936129736129369182");
,它也可以正常工作。当我按strcpy(buffer, "1234567891012983629361297361293691823691823869182632918263918");
时会产生错误。
更多的是理论问题,而不是实践问题,但我希望它对新手和经验丰富的程序员有所帮助,因为它讨论了基础知识,并有助于提高编码道德。预先感谢。
答案 0 :(得分:4)
简单的答案是C不能保护您免受自己的伤害。检查边界是您的责任。该程序将在您指示的任何地方愉快地读写。但是,如果您这样做,操作系统可能会说些什么,这通常是“分段错误”。更糟糕的情况是它可能会覆盖其他变量。
这是C语言中许多错误的源头,所以要小心。每当您在缓冲区外进行写操作时,您都会调用未定义行为,并且这些行为可以通过各种方式表现出来,包括程序按其应有的方式工作,覆盖变量和分段错误。
我不能输入超过2个字符和空终止符
这是一个常见的错误。它不是“加空终止符”。它包含空终止符。