Cem*_*mre 12 c indexoutofboundsexception
我在C中有这个代码,它接受了一堆chars
#include<stdio.h>
# define NEWLINE '\n'
int main()
{
char c;
char str[6];
int i = 0;
while( ((c = getchar()) != NEWLINE))
{
str[i] = c;
++i;
printf("%d\n", i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输入是:testtesttest
输出:1 2 3 4 5 6 7 8 117 118 119 120
我的问题是:
虽然我明显超出了阵列的容量,为什么我不会出现超出界限(分段错误)的异常?
为什么输出中的数字会突然跳到很大的数字?
我在C++中试过这个并且得到了相同的行为.请问有谁可以解释一下这是什么原因?
Car*_*rum 26
str[i] = c写入会覆盖该值i.访问数组索引时,C和C++不进行绑定检查.只有当您尝试读取或写入未分配的页面(或尝试在不允许的页面上执行某些操作,例如尝试写入只读页面)时,才会发生分段错误,但由于页面通常是非常大(几千字节的倍数;在Mac OS上,4 KB的倍数),它经常会留下很多空间来溢出.
如果你的阵列在堆栈上(就像你的一样),它可能会更糟,因为堆栈通常非常大(高达几兆字节).这也是安全问题的原因:写入堆栈上的数组边界可能会覆盖函数的返回地址并导致任意代码执行(着名的"缓冲区溢出"安全漏洞).
您阅读时获得的值正是在这个特定的地方发生的事情.它们完全没有定义.
如果你使用C++(并且很幸运能够使用C++ 11),标准定义了std::array<T, N>类型,它是一个知道其边界的数组.at如果您尝试阅读它的结尾,该方法将抛出.
| 归档时间: |
|
| 查看次数: |
22040 次 |
| 最近记录: |