遵义 网站建设,东莞网站建设 鞋材厂,个人做哪方面的网站,纸牌网站建设越界访问是指访问#xff08;操作修改#xff09;了不属于自己的空间
我们以如下代码为例#xff1a;此代码在vs中进行
#include stdio.h
int main()
{int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i12; i){arr[i] 0;printf(hello\n);}r…越界访问是指访问操作修改了不属于自己的空间
我们以如下代码为例此代码在vs中进行
#include stdio.h
int main()
{int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i12; i){arr[i] 0;printf(hello\n);}return 0;
}
想想这个代码的结果如何
可能你的答案是打印13个hello
NO正确答案是死循环地打印hello
解释
数组只有10个元素故而合法的下标范围是0~9
这个代码的本意是将数组中的所有元素置成0
但是在完成这项任务后i继续继而访问不属于arr数组的内存空间将arr[10]0 arr[11]0,arr[12]0其实arr[12]就是i即在循环中将i变成了0
也就是说i从0开始直到12又变成0再不断达到12故而每12次i会变成0从头开始永远也不会满足结束循环的条件因为i最大就是12
原理
1 i和arr数组都是局部变量是在栈区上的
栈区内存的使用习惯是先使用高地址处的空间再使用低地址处的空间
2 数组随着下标的增长地址是由低到高变化的
以下是演示图例 在vs中i和arr数组中间留2个空间
在gcc中中间留1个空间
在vc6.0中中间不留空间