数组越界可能造成的死循环风险

//数组越界造成的死循环风险
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)  //当小于等于11时会报错,而小于等于12的时候不会,
	{	                      //原因是小于等于12的时候死循环,导致没有机会报错,因为报错是在程序结束后发生的
		printf("沉迷学习,无法自拔\n");
		arr[i] = 0;
	}
	return 0;
}

以上程序在debug版本下运行时会出现死循环的情况。原因如下: alt 该程序在运行时,由于i和arr都属于局部变量,故会在栈区创建,由于i在前,arr在后,且系统栈区是由高到低的,故变量i创建在高地址,数组arr创建在低地址,当数组访问越界且i=12时,arr[12]=0,arr[12]与i在同一空间,故此时i==0,造成死循环。

注意:

(1)在不同的编译器下,数组与变量间的空余空间不同,vs2019下是2个空间。

(2)在release版本下,不会造成死循环,原因是编译器将代码优化时,使变量i创建在数组之后。

全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务