为什么我能复制的字符数超出char数组中定义的字节数?

时间:2019-10-30 09:38:45

标签: c memory-management buffer-overflow

我有以下代码:

#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");时会产生错误。

更多的是理论问题,而不是实践问题,但我希望它对新手和经验丰富的程序员有所帮助,因为它讨论了基础知识,并有助于提高编码道德。预先感谢。

1 个答案:

答案 0 :(得分:4)

简单的答案是C不能保护您免受自己的伤害。检查边界是您的责任。该程序将在您指示的任何地方愉快地读写。但是,如果您这样做,操作系统可能会说些什么,这通常是“分段错误”。更糟糕的情况是它可能会覆盖其他变量。

这是C语言中许多错误的源头,所以要小心。每当您在缓冲区外进行写操作时,您都会调用未定义行为,并且这些行为可以通过各种方式表现出来,包括程序按其应有的方式工作,覆盖变量和分段错误。

  

我不能输入超过2个字符和空终止符

这是一个常见的错误。它不是“加空终止符”。它包含空终止符。