数组越界程序为什么不crash
Linux 64位系统,有一行代码有数组越界,如下,
a[0][0] = b[-2].name[0];
为什么程序有时候crash,有时候不crash,如果数组b的首地址是0xffd9cda4, b[-2]的地址要怎么换算,0xffd9cda4+0xfffffffe=0x1ffd9cda2? -2的情况下是如何寻址的?
求高手指教
[解决办法]
内存是按页进行分配的,如果越界访问的依然是本页的内容,就可能不会crash。
[解决办法]
越界在C/C++层次上属于“错误”,错误了当然不会给你任何保证。就如同你对某个人说“如果你喝醉了,请告诉我”,那对方可以能“喝醉了,睡着了”,也可能“喝醉了,跑过来跟你说他没醉”,你不能期待一个已经神智不清的人给你任何保证。
Crash其实是操作系统的行为,不是C/C++的,对于一个神智不清的醉汉,他有可能到大街上裸奔,被警察给逮住了(Crash);也有可能安静中的睡着了,警察是不会来抓他的(不Crash)
[解决办法]
偷汉子的不一定每次都会被捉尖在床的。
[解决办法]
属于未定义的行为,结果不可预测。
[解决办法]
C语言是不检查数组越界的,你写的b[-2]也不会编译抛错,可能会在运行时出错。
[解决办法]
操作系统的内存管理还没精确到字节。
[解决办法]
系统分配内存是按页分配的,超界的时候可能访问到的内存仍然是分配给这个进程的,这种情况下是不会crash的,而当访问的内存是一块未分配的内存的时候,才会导致crash发生~
[解决办法]
C 认为你要为自己的行为负责