C语言中数组越界访问造成死循环现象
大家请看这样一段代码(工具:VC++6.0):
#include <stdio.h>
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!
不过,结果却是这样:
什么意思呢?就是说"Program is end!"根本没打印出来,换句话说就是:程序进入了一个死循环。
要是我换一种写法:
#include <stdio.h>
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;
}
结果又是怎样呢?
这次成功的打印出"Program is end!"了。不过,系统却弹出了这样一个提示窗口——arr.exe已停止工作。这是由于我们越界操作,导致程序崩溃了。这个好理解,纳闷的是,同样的代码,为什么结果却出现这么大的不同呢?
两端代码唯一的不同就在于循环变量i和数组arr的定义先后顺序不一样,问题,也只可能出现在这里。
原来,在VC++6.0编译器中,按照内存地址递减的方式来给变量分配内存。在前一段代码中,地址分配如下:
在越界访问arr[10]的时候,实际上进行的操作时为变量i所在位置赋值为0,故,每次执行到i = 10的时候,i就被赋值为0,程序永远出不来。成为了一个死循环。
而在后一段代码中,内存分配情况如下:
当执行到arr[10] = 0的时候,实际上是把上图arr[9]左边的一块区域设置为0,与i无关,故程序能跳出循环。但这种访问时非法的,故,程序会异常终止。
原文链接:https://blog.csdn.net/u013000434/article/details/17403311
C语言中数组越界访问造成死循环现象相关推荐
- c语言中数组的定义与应用
定义方法: 类型 变量名[元素个数]: 比如: int a[6]; char b[24]; double c[3]; 注意,c语言中数组的元素个数是不能动态定义的(修改:在c99中已经可以了) 也 ...
- C语言丨数组越界及其避免方法详解
来自公众号:技术让梦想更伟大 作者:李肖遥 所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之 ...
- c语言中数组的变量j是什么,c语言中数组,一般数组
c语言中数组,一般数组. 1.什么是数组,数组有什么用? 为了方便处理而把类型相同的变量有序地组织起来的一种形式. 类型相同的元素集中起来,在内存上排成一条直线. 2.数组的声明. 元素类型.变量名和 ...
- c语言中数组的概念及作用,C语言数组的定义及其使用方法
什么是数组? 在我们学习数组前先让我们介绍一下c语言中数组是什么?数组就是一个个元素按照一定顺序排列的集合.它将数据从最低的内存地址保存到最高的内存地址. 声明一个数组 c语言规定了声明数组的格式: ...
- JavaScript数组越界访问
JavaScript数组越界访问不会报错,只会返回undefined. let arr = ['t1', 't2']; console.log(arr[2]); // undefined 但这样访问会 ...
- c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作
C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...
- 从编译器角度分析C语言中数组名和指针的区别
从编译器角度分析C语言中数组名和指针的区别 数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变. 例如你可 ...
- 如何确定C语言中数组的大小?
如何确定C语言中数组的大小? 也就是说,数组可以容纳多少个元素? #1楼 如果您要处理未作为参数接收的数组,则sizeof方法是正确的方法. 作为参数发送给函数的数组被视为指针,因此sizeof将返回 ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
最新文章
- c2054未定义基类_c++ - 错误C2504:基类未定义 - 堆栈内存溢出
- 需要监控JanusGraph的一些指标
- ADO.NET 2.0 Dataset和Datatable 新功能新特性
- LiveGBS-GB28181流媒体服务如何实现跨域鉴权
- mysql执行语句_实时查看MySQL执行的语句
- 【Android Studio安装部署系列】十一、Android studio获取数字签名信息
- 第三次学JAVA再学不好就吃翔(part104)--flush和close
- Java 中单引号和双引号的区别
- JavaScript:通过id来进行元素的取得
- 扩展DropDownList控件和ListBox控件(1) - 支持分组功能(optgroup标签)
- Node对CommonJS模块的实现
- 剑指offer面试题10- I. 斐波那契数列
- python基本代码教程-(Python基础教程之三)Python代码中添加注释
- Linux下pppd拨号脚本配置(转载)
- 计算机IP掩码的与运算,计算机IP地址与子网掩码如何进行AND运算
- 微信小程序授权登录、绑定手机号(接口+小程序)
- 【理科】2020年高考数学(第十二章复数、算法、推理与证明)考点与题型全归纳
- 卡内基梅隆计算机专业,2019美国大学计算机科学专业排名TOP10一览 卡内基梅隆大学居...
- gis城市模型建立之地形模型的建立
- C语言指针(函数指针数组,二级指针)
热门文章
- IoT -- (九) IoT通讯技术选型与模型设计
- matlab 由移相角如何产生移相脉冲,整流电路控制角移相范围是怎么确定的?
- ajax 传字符串到后台,JSON.stringify()将JSON对象转换为字符串通过Ajax传入到后台处理...
- python 心电处理包_python 黏包现象及其解决方案
- vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...
- 技校毕业是什么学历_初中毕业上技校学什么专业好
- java 多态实现的jvm调用过程_多态:JVM是如何进行方法调用的
- MySQL 基础 ———— SQL语句的执行顺序与 LIMIT 子句
- Linux 实操———CentOS 6 安装配置 Oracle JDK 1.8
- coffeescript html5,HTML5——前端预处理技术(Less、Sass、CoffeeScript)