源于《C陷阱与缺陷》----研究程序死循环问题

简介: 所以最后答案应该就是打印了12次xiao tao,然后越界访问出现错误,使arr[10]=0,arr[11]=0了 但最后答案却不是这样。

本题来源于《C陷阱与缺陷》这本书,从本质上讲解程序死循环的原因,关键在于栈的空间使用方式。


研究程序死循环的原因


题目1:


在VS2019 X86环境下测试:

int main()
{
  int i;
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  for (i = 0; i < 12; i++)
  {
    printf("xiao tao\n");
    arr[i] = 0;
  }
  return 0;
}


你觉得该代码有什么问题呢?


1.越界访问
2.死循环


第一个问题越界访问非常容易看出来,数组arr只有10个元素,下标从0-9,而循环12次,肯定越界访问了


每次都会打印一个xiao tao,并且把对应的arr[i]置为0。


所以最后答案应该就是打印了12次xiao tao,然后越界访问出现错误,使arr[10]=0,arr[11]=0了


但最后答案却不是这样。


答案变成了死循环了,死循环打印xiao tao


32440c4f7fa740d2b36eb021151c571f.png


死循环的原因是什么呢?


这里涉及有关栈空间的知识:


1.
内存空间分为栈区,堆区和静态区
栈区一般存放局部变量,函数参数,函数返回值等
堆区是用来分配动态开辟的空间的
静态区是存放全局变量,static修饰的静态变量等

5ef58dbae9aa48c786f82abbf9bbe23f.png

2.局部变量是在栈区存放的


3.栈区的使用习惯:
先使用高地址处的空间
再使用低地址处的空间


4.数组的地址随着下标的增长,地址是由低到高变化的


ca045e34c61e450ea9dc3ea153632bfe.png


注意:


该测试是在VS2019 X86环境下进行,其他环境可能不一样,结果也就不一样,不能一概而论。


在变量i与数组之间一定有两个整形空间吗?


答案:不一定。


在VS2019 X86环境下,变量i与数组之间确实空了两个整形变量空间大小。


而在VC6.0环境下,变量i与数组之间没有剩余空间。


在gcc环境下,变量i与数组之间有一个整形空间大小


e56373ffdca5429086e2d7a0f4fd4cfe.png


解决方法


可能有的人会这样想将变量i定义在数组的下面这样就不会发生死循环了


我们从栈空间使用方面来看,这样当然可以避免死循环,但是难道我们以后写数组都要把i写在数组的后面吗?


这样只能解决当前的问题,而不能解决根本。不过现在的编译器大多数会自己修改这个死循环问题,比如将变量的i的地址放在数组的下面,在release版本就是这样进行优化不会死循环。


我们一般可能想不到这样本质原因,但我们可以通过调试来解决这个问题


当让i不断的++,当i等于10时将arr[10]置0,当i等于11时将arr[11]置0,然后我们通过调试监视发现arr[12]与i的值相等,这时我们就要想到为什么会死循环了,arr[12]的地址就等于i的地址,将arr[12]修改成0,就等于将i改为0了。


82af58ea45154e6abb9deb1bdee9681c.png


将arr[12]置0,发现i也变成0了


aff6f09dac344132bf49fb0cf3ea575e.png


总结


其实这道题是在特殊环境下才能实现的,但我们还是要注意的是其中的知识点:

1.栈区的使用习惯

先使用高地址的空间

再使用低地址的空间

2.数组随着下标的增长,地址不断增大


题目2:


1c8d0412ef65473cbd44b39916ab38db.png


本题来源于某公司面试题,与题1一模一样,都是会越界访问,发生死循环,本质上都是栈空间使用问题。

相关文章
|
1月前
|
人工智能 自然语言处理 测试技术
用Dify搭建可复用的测试用例工厂
利用Dify搭建可复用的测试用例工厂,实现自然语言到测试用例的智能生成。结合大模型与测试方法论,提升用例覆盖率与编写效率,降低维护成本,推动测试开发智能化升级。关注霍格沃兹测试学院,回复「资料」获取AI测试开发技术合集。
|
9月前
|
人工智能 边缘计算 监控
AI视频监控在大型商场的技术方案
该系统通过人脸分析模块利用FaceNet等模型提取顾客的性别、年龄和表情特征,快速生成群体画像。隐私保护模块采用匿名化技术和实时模糊处理,确保数据安全,并通过边缘计算减少隐私泄露风险。数据可视化与报告功能自动生成统计报告,支持服务优化和营销决策。核心技术包括高精度的人脸分析模型、全面的隐私保护措施及直观的数据可视化工具。
184 0
AI视频监控在大型商场的技术方案
|
存储 边缘计算 安全
边缘计算与云计算的协同工作:技术解析与应用前景
【8月更文挑战第4天】边缘计算与云计算的协同工作是未来信息技术发展的重要趋势。通过合理地分配任务和资源,两者可以相互补充、发挥各自的优势,实现更高效的数据处理和分析。这种协同模式不仅提高了系统的性能和可靠性,还满足了复杂多变的应用需求,为人工智能、物联网等技术的发展提供了强有力的支持。
966 11
|
Web App开发 数据采集 JavaScript
利用无头浏览器爬取JavaScript生成的网页
利用无头浏览器爬取JavaScript生成的网页
|
11月前
|
机器学习/深度学习 边缘计算 自然语言处理
《C++赋能文本分类与情感分析:开启智能文本处理之旅》
在数字化信息爆炸的时代,文本数据激增,文本分类和情感分析成为关键任务。C++以其高效性能,为实现这些任务提供了有力支持。本文介绍了文本分类和情感分析的基础概念、特征提取方法(词袋模型、TF-IDF、词向量)、模型选择与构建(朴素贝叶斯、SVM、CNN、RNN)、模型训练与优化,以及应用场景和未来展望。C++在这些领域展现出巨大潜力,助力数字化转型和智能化发展。
171 11
|
数据采集 Web App开发 JavaScript
爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集
本文介绍了在Python中使用DrissionPage库和Auth代理Chrome插件抓取163新闻网站数据的方法。针对许多爬虫框架不支持代理认证的问题,文章提出了通过代码生成包含认证信息的Chrome插件来配置代理。示例代码展示了如何创建插件并利用DrissionPage进行网页自动化,成功访问需要代理的网站并打印页面标题。该方法有效解决了代理认证难题,提高了爬虫的效率和安全性,适用于各种需要代理认证的网页数据采集。
1218 0
爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集
|
11月前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
1791 9
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
数据可视化 Python
【Python可视化】绘制学生成绩的雷达图
【Python可视化】绘制学生成绩的雷达图 雷达图,又叫蜘蛛网图、极坐标图。 雷达图相当于平行坐标图,其中轴径向排列。
938 0
【Python可视化】绘制学生成绩的雷达图
|
供应链 监控 算法
ERP系统中的库存优化与库存周转率分析解析
【7月更文挑战第25天】 ERP系统中的库存优化与库存周转率分析解析
1251 1
Qt6学习笔记十四(文件读写、文件信息读取)
Qt6学习笔记十四(文件读写、文件信息读取)
571 0