c语言访问数组越界会终止吗,C语言中数组越界访问造成死循环现象

本篇文章纯属娱乐,没太多技术性的东西。只是我觉得还比较有意思,所以记一下!

0818b9ca8b590ca3270a3433284dd417.png>

大家请看这样一段代码(工具:VC++6.0):

#include

int main(int argc, char *argv[])

{

int i;

int arr[10];/* 这里注意循环变量i与数组arr的定义顺序 */

for(i = 0; i <= 10; i++)/* 这里越界了 */

{

arr[i] = 0;

printf("arr[%d] = %d\n", i, arr[i]);

getch();/* 等待一次输入,按一下键盘,循环一次,编译调试 */

}

printf("Program is end!\n");

return 0;

}

很显然,在本段代码中,出现了一个越界操作的问题。不过幸运的是,编译还是通得过的。大家猜想结果是什么呢?我原本以为会输出如下字符:

arr[0] = 0

arr[1] = 0

arr[2] = 0

arr[3] = 0

arr[4] = 0

arr[5] = 0

arr[6] = 0

arr[7] = 0

arr[8] = 0

arr[9] = 0

arr[10] = 0

Program is end!

不过,结果却是这样:

0818b9ca8b590ca3270a3433284dd417.png

什么意思呢?就是说"Program is end!"根本没打印出来,换句话说就是:程序进入了一个死循环。

要是我换一种写法:

#include

int main(int argc, char *argv[])

{

int arr[10];

int i;/* 这里注意循环变量i与数组arr的定义顺序 */

for(i = 0; i <= 10; i++)/* 这里越界了 */

{

arr[i] = 0;

printf("arr[%d] = %d\n", i, arr[i]);

getch();/* 等待一次输入,按一下键盘,循环一次,编译调试 */

}

printf("Program is end!\n");

return 0;

}

结果又是怎样呢?

0818b9ca8b590ca3270a3433284dd417.png

这次成功的打印出"Program is end!"了。不过,系统却弹出了这样一个提示窗口——arr.exe已停止工作。这是由于我们越界操作,导致程序崩溃了。这个好理解,纳闷的是,同样的代码,为什么结果却出现这么大的不同呢?

两端代码唯一的不同就在于循环变量i和数组arr的定义先后顺序不一样,问题,也只可能出现在这里。

原来,在VC++6.0编译器中,按照内存地址递减的方式来给变量分配内存。在前一段代码中,地址分配如下:

0818b9ca8b590ca3270a3433284dd417.png

在越界访问arr[10]的时候,实际上进行的操作时为变量i所在位置赋值为0,故,每次执行到i = 10的时候,i就被赋值为0,程序永远出不来。成为了一个死循环。

而在后一段代码中,内存分配情况如下:

0818b9ca8b590ca3270a3433284dd417.png

当执行到arr[10] = 0的时候,实际上是把上图arr[9]左边的一块区域设置为0,与i无关,故程序能跳出循环。但这种访问时非法的,故,程序会异常终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值