C语言数组越界引发的死循环问题解决

 更新时间:2022年08月07日 11:46:44   作者:小牛要翻身  
本文主要介绍了C语言数组越界引发的死循环问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、引入

下面的程序在VS编译器会出现什么问题?运行结果是什么?为什么?

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello\n");
    }
    return 0;
}

运行结果:

如下图:代码死循环

在这里插入图片描述

二、代码缺陷

上述代码有两个问题:

数组访问越界死循环

三、为什么会死循环?

1、i和arr都是局部变量,在内存中局部变量都是存储在栈区的。

2、数组随着下标的增长,地址是由低到高变化的。

3、栈区的内存规定:先使用高地址处的空间,再使用低地址处的空间。

根据上述代码可知,程序会先在栈区中高地址处为变量i开辟空间,再在栈区中由高到低依次为数组arr开辟空间

如下图👇

通过调试我们可以在内存中观察到如下变化:

for循环中,i 的内容是从0,一直增加到12,而数组只有10个空间,因此会越界,每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位置恰好为i的位置,即arr[12]恰巧将i设置为0,因此造成死循环。

四、补充说明

上述代码在不同的编译器中具有不同的效果,并且与运行环境有关。

在VS2013/2019/2022的x86环境中,i和arr间相隔两个整形。即i<=12就死循环在gcc中间空相隔一个整形。即i<=11就死循环在VC6.0中间没有多余的空间。即i<=10就死循环

五、总结

在写代码的时候我们可能会遇到各种各样的问题:语法错误、编译错误、运行错误……
但是我们在制造Bug的同时也要努力成为一名 Bug终结者
学会发现问题,解决问题并且避免出现问题是一名合格程序员的基本素养。这就要求我们要掌握一定的调试技巧,养成良好的编程习惯。

到此这篇关于C语言数组越界引发的死循环问题解决的文章就介绍到这了,更多相关C语言数组越界内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析C语言结构体及位段

    解析C语言结构体及位段

    今天小编就为大家分享一篇关于解析C语言结构体及位段,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++中基类和派生类之间的转换实例教程

    C++中基类和派生类之间的转换实例教程

    这篇文章主要介绍了C++中基类和派生类之间的转换,有助于深入理解C++面向对象程序设计,需要的朋友可以参考下
    2014-08-08
  • C++基于socket UDP网络编程实现简单聊天室功能

    C++基于socket UDP网络编程实现简单聊天室功能

    这篇文章主要为大家详细介绍了C++基于socket UDP网络编程实现简单聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言 详细讲解接续符和转义符的使用

    C语言 详细讲解接续符和转义符的使用

    接续符是用来告诉编译器行为的符号,那编译器遇到接续符是什么行为呢,就是去掉接续符,然后把下一行连接到现在这行上面,转义符是主要用于表示无回显字符,也用于表示常规字符,转义符必须放在单引号或者双引号里面
    2022-04-04
  • C++实现一个线程安全的单例工厂实现代码

    C++实现一个线程安全的单例工厂实现代码

    这篇文章主要介绍了 C++实现一个线程安全的单例工厂实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++实现词法分析器

    C++实现词法分析器

    这篇文章主要为大家详细介绍了C++实现词法分析器的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • c语言求1+2+...+n的解决方法

    c语言求1+2+...+n的解决方法

    本篇文章是对在c语言中求1+2+...+n的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言开发实现井字棋及电脑落子优化示例详解

    C语言开发实现井字棋及电脑落子优化示例详解

    以前上课经常和同桌玩起井字棋,那么我们就当我们回忆童年,现在也用C语言来实现井字棋,本次代码相对于初阶的井字棋,在电脑下棋代码部分做了优化,使得电脑更加具有威胁
    2021-11-11
  • 将 C++ 类型属性暴露给 QML

    将 C++ 类型属性暴露给 QML

    这篇文章主要介绍了将 C++ 类型属性暴露给 QML, QML 是一种基于 JavaScript 的声明式语言。在 Qt5中,QML有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言下面一起进入文章学习 QML的条件下也看看如何将将 C++ 类型属性暴露给 QML,需要的朋友可以参考一下
    2021-12-12
  • C语言函数指针数组实现计算器功能

    C语言函数指针数组实现计算器功能

    这篇文章主要通过C语言函数指针数组实现了计算器的功能,是一个很好而且流程详细的小例子,感兴趣的新手朋友们可以自己动手也写一遍
    2022-04-04

最新评论