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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

作用和用法在多线程对共享资源进行并发访问方面&#xff0c;JDK提供了synchronized关键字来进行线程同步&#xff0c;实现多线程并发访问的线程安全。synchronized的作用主要体现在三个方面&#xff1a;(1)确保线程互斥地访问同步代码&#xff1b;(2)保证共享变量的线程可见性&…

Apache shutdown unexpectedly启动错误解决方法

xampp启动时显示的错误为&#xff1a; 9:52:41 [Apache] Attempting to start Apache app... 9:52:41 [Apache] Status change detected: running 9:52:42 [Apache] Status change detected: stopped 9:52:42 [Apache] Error: Apache shutdown unexpectedly. 9:52:42 …

java基础代码实例_基础篇:详解JAVA对象实例化过程

1 对象的实例化过程对象的实例化过程是分成两部分&#xff1a;类的加载初始化&#xff0c;对象的初始化要创建类的对象实例需要先加载并初始化该类&#xff0c;main方法所在的类需要先加载和初始化类初始化就是执行方法&#xff0c;对象实例化是执行方法一个子类要初始化需要先…

搭建webUI自动化及问题解决:Message: ‘chromedriver‘ executable needs to be in PATH.解决办法

搭建webUI自动化环境 1、conda install selenium即可。 若出现&#xff1a;Message: chromedriver executable needs to be in PATH.Please see https://sites.google.com/a/chromium.org/chromedriver/home。 报错原因&#xff1a;没有配置chrome浏览器的chromedriver 解决…

python内置输入函数_python内置函数 print()

英文文档&#xff1a;print(*objects, sep’ ‘, end’\n’, filesys.stdout, flushFalse)Print objects to the text stream file, separated by sep and followed by end. sep, end, file and flush, if present, must be given as keyword arguments.All non-keyword argume…

webUI自动化一元素定位

实现功能&#xff1a;自动在百度输入框输入test&#xff0c;并进行搜索 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("http://www.baidu.com")input_text driver.find_element_by_id("kw") print(&quo…

python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解

本文实例讲述了python数据库操作mysql&#xff1a;pymysql、sqlalchemy常见用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;相关内容&#xff1a;使用pymysql直接操作mysql创建表查看表修改表删除表插入数据查看数据修改数据删除数据使用sqlmary操作mysql创建表查…

webUI自动化二-获取元素信息相关方法

from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("D:\QQFile\注册A.html")# 1获取用户输入框的大小 input_text driver.find_element_by_id("userA") print("元素大小为&#xff1a;",input_text…

python环境变量的配置 alias_配置别名

有没有经常敲错命令&#xff1f;比如git status&#xff1f;status这个单词真心不好记。如果敲git st就表示git status那就简单多了&#xff0c;当然这种偷懒的办法我们是极力赞成的。我们只需要敲一行命令&#xff0c;告诉Git&#xff0c;以后st就表示status&#xff1a;$ git…

C语言-字符串处理函数strcpy

strcpy 原型&#xff1a;strcpy(char destination[], const char source[]); 功能&#xff1a;将字符串source拷贝到字符串destination中。此处将source中的字符串结束标志符‘\0’也一同复制。所以在输出时&#xff0c;切不可以用‘\0’&#xff0c;puts&#xff0c;printf输…

pythonjavascript一起开发_Python开发【第十一篇】:JavaScript

JavaScript是一门编程语言&#xff0c;浏览器内置了JavaScript语言的解释器&#xff0c;所以在浏览器上按照JavaScript语言的规则编写相应代码之&#xff0c;浏览器可以解释并做出相应的处理。一、如何编写1、JavaScript代码存在形式Js代码内容2、JavaScript代码存放位置HTML的…

C语言-字符串处理函数strcat

strccat-字符串拼接函数 char*strcat(char* strDestination, const char* strSource); 参数说明&#xff1a; strDestination&#xff1a;目的字符串&#xff1b;strSource&#xff1a;源字符串。 strcat() 函数把 strSource 所指向的字符串追加到 strDestination 所指向的字…

js数组截取前5个_我不能没有的5个Vue.js库

1.Click Off to Close有的时候&#xff0c;我们需要在用户点击元素之外的时候触发一个事件。最常见的用例是当你想通过点击关闭一个下拉框或对话框时。这是一个必不可少的包&#xff0c;几乎在我构建的每个应用中都会用到。首选&#xff1a;vue-clickawayhttps://github.com/si…

this.$router.push如何刷新页面_小程序丨微信小程序如何实现页面下拉刷新

微信小程序蕴含着众多功能&#xff0c;本期将简单介绍实现页面下拉刷新的方法&#xff0c;通过阅读本文&#xff0c;读者们可以自行动手操作&#xff0c;在实践中认识微信小程序。首先&#xff0c;我们需在json配置中写出以下配置&#xff1a;"enablePullDownRefresh"…

C语言-字符串处理函数strcmp

strcmp-字符串比较函数 原型&#xff1a;int strcmp(const char firststring[], const char secondstring); 功能&#xff1a;比较两个字符串firststring和secondstring 如果等于 返回值为0 如果字符串1大于字符串2 函数值返回为1 如果字符串1小于字符串2 函数值返回为-1 …

导出excel数字前面的0消失_Excel操作中常见的3大坑你遇到过吗?遇到应该这么解决...

在excel中的我们获取数据的方式一是自己录入数据&#xff0c;二是通过网络或其他的途径导出的源数据&#xff0c;不管哪种的方式&#xff0c;对我们处理数据的来说都十分重要&#xff0c;这里我们需要注意这些点并成功跳过这些不按原理只按自己习惯的坑。今天要聊的坑有3个&…

matplot绘制图形入门

一、折线图 """ File: 折线图.py Author: chde_wang Date: 2021-05-23 22&#xff1a;26&#xff1a;04 Description: """ # 绘制折线图 import numpy as np import matplotlib.pyplot as plt x np.linspace(0, 2 * np.pi, 100) y1, y2 np.si…

kafka使用_Kafka介绍与使用

最近在研究kafka&#xff0c;觉得需要输出点东西才能更好的吸收&#xff0c;遂总结与大家分享&#xff0c;话不多说。一、先上思维导图&#xff1a;二、再上kafka整体架构图&#xff1a;2.1、Producer&#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端。2.2…

int 为什么是2147483647_int范围为啥是-2147483648到2147483647

单位换算 1 Byte(B) 8 bit 1 Kilo Byte(KB) 1024B 1 Mega Byte(MB) 1024 KB 1 Giga Byte (GB) 1024 MB 1 Tera Byte(TB) 1024 GB 1 Peta Byte(PB) 1024 TB 从上可以了解计算机最小的存储单位是bit&#xff0c;即一位二进制数(0 或 1)&#xff0c;8个二进制位为一个字…

linux 关闭端口_手把手教你在Linux中快速检测端口的 3 个小技巧

一个执着于技术的公众号前言 无论是要解决网络连接问题还是配置防火墙&#xff0c;第一件事是要检查系统实际打开了哪些端口。本文介绍了几种快速查找 Linux 系统上哪些端口向外部开放的方法。什么是开放端口 监听端口是应用程序监听的网络端口。你要得到的监听端口名单通常可以…