每日一题——在windows x86/64 VS环境下,下面的程序会出现什么问题?运行结果是什么?为什么?

简介: 哈喽大家好,我是保护小周ღ,本期为大家带来的是博主在学习过程中遇到的一道笔试题,题目不难,但是有点复杂),涉及到局部变量在内存中存储的这一方面知识,还是值得学习一下的,欢迎留言啊~

image.gif编辑

 

哈喽大家好,我是保护小周ღ,本期为大家带来的是博主在学习过程中遇到的一道笔试题,题目不难,但是有点复杂),涉及到局部变量在内存中存储的这一方面知识,还是值得学习一下的,欢迎留言啊~

image.gif编辑

这是一道笔试题,原题是在Linux x86/64 gcc环境下,博主觉得这题还是考察了很多知识点,所以写下这篇博客,给大家分享一下,解题思路。

#include<stdio.h>intmain()
{
inti=0;
intarr[] = {1,2,3,4,5,6,7,8,9,10};
for (i=0;i<=12;i++)
    {
arr[i] =0;
printf("Hello World!\n");
    }
return0;
}

image.gif


我们先以windows X86 VS2019 的环境来观察这道题:

程序会出现什么问题?

一、不考虑其他情况,这段程序会造成越界访问

二、实际上程序会造成越界访问,也会造成死循环

运行结果如下:

image.gif编辑

大多数朋友应该都知道,程序会造成越界访问,但是这是笔试题呀,怎么会这么简单呢,接下来博主来给大家分析分析程序为什么会造成死循环

首先来了解两个知识点:

    1. 变量 i 和数组 arr 都是局部变量,局部变量在内存的栈区上开辟的。
    2. 栈区内存的使用习惯:先使用高地址处的空间,再使用低地址处的空间。
    3. arr 数组在内存的栈区上开辟了一块连续的存储空间(40个字节),数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。

    由程序可知,我们先定义的变量 i 后定义的数组 arr,所以他们在内存中的存储示意图为:

    image.gif编辑

    数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。

    此时如果数组造成了越界访问到一定的空间,是不是会访问到 变量 i 的地址啊。这个时候

    arr[ i ]=0;因为他们现在代表的是同一个地址,所以 i 的值也会重置为0,作为调整部分的 i 的值不断重置,程序自然而然会造成死循环。

    image.gif编辑

    相信大家应该已经能理解了吧,当然我们的编译器也会报错,这个题,考察的是你对局部变量、数组等在内存中的存储。

    image.gif编辑


    总结

    我们在这个题遇到一些问题还没有给大家解答疑惑:

    一、栈区,堆区等是操作系统这门学科对内存的划分

    二、关于 i 和 arr 之间间间隔的空间

    image.gif编辑

      1. VC 6.0 中间没有多余的空间
      2. gcc 中间间隔1个空整型空间
      3. VS 2013/2019/2022等 中间间隔2个空整型空间

      当然在不同的操作系统环境下,不同的编译器,以及 x86(32位),64,也会有不同的表现。

      image.gif编辑

      这是64位的编译器这段程序的表现,就不会造成死循环,相信大家应该能够理解吧。


      本期收录于博主的专栏——每日一题,适用于编程初学者,有兴趣的朋友们可以订阅,查看其它“精彩小题”。每日一题_保护小周ღ的博客-CSDN博客

      感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★*

      image.gif编辑

       如有侵权请联系修改删除! image.gif编辑

      相关文章
      |
      6月前
      |
      XML 存储 搜索推荐
      Omnissa Dynamic Environment Manager 2503 - 个性化动态 Windows 桌面环境管理
      Omnissa Dynamic Environment Manager 2503 - 个性化动态 Windows 桌面环境管理
      102 7
      Omnissa Dynamic Environment Manager 2503 - 个性化动态 Windows 桌面环境管理
      |
      3月前
      |
      Linux 虚拟化 iOS开发
      VMware Fusion 13.6.4 OEM BIOS 2.7 - 在 macOS 中运行 Windows 虚拟机的最佳方式
      VMware Fusion 13.6.4 OEM BIOS 2.7 - 在 macOS 中运行 Windows 虚拟机的最佳方式
      371 3
      |
      3月前
      |
      Windows
      Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
      Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
      119 2
      |
      4月前
      |
      Windows
      Windows下版本控制器(SVN)-启动服务器端程序
      Windows下版本控制器(SVN)-启动服务器端程序
      118 4
      |
      5月前
      |
      安全 Devops 测试技术
      AppSpider 7.5.018 for Windows - Web 应用程序安全测试
      AppSpider 7.5.018 for Windows - Web 应用程序安全测试
      97 0
      AppSpider 7.5.018 for Windows - Web 应用程序安全测试
      |
      6月前
      |
      Ubuntu 数据库 虚拟化
      Windows 环境下 Odoo 安装保姆级教程
      本教程详细介绍了在 Windows 系统上通过虚拟机部署 Odoo 的完整流程。首先确认硬件需求,确保 CPU、内存和磁盘空间满足最低配置;接着安装 VMware Workstation Pro 并创建 Ubuntu 虚拟机,配置桥接网络以实现主机与虚拟机的通信;随后借助微聚云快速安装预配置好的 Odoo 环境,简化复杂环境搭建;最后通过浏览器访问虚拟机 IP,完成 Odoo 数据库初始化及基础设置。整个过程清晰易懂,适合新手快速上手 Odoo 部署。
      731 4
      |
      8月前
      |
      安全 JavaScript Java
      AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
      AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
      102 12
      AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
      |
      7月前
      |
      存储 运维 监控
      提升Windows Server环境安全性:ADAudit Plus的五大关键优势
      在Windows Server环境中,内置的安全审计工具虽有用,但存在专业门槛高、耗时及功能缺失等问题。第三方工具ADAudit Plus应运而生,其五大优势包括:日志聚合、关键活动检测、定制化报告、灵活安全配置和长期日志保留,有效提升系统监控与合规能力。选择ADAudit Plus,助力企业更高效应对审计挑战,强化安全性。
      160 2
      |
      7月前
      |
      Windows
      Windows程序的数字签名证书怎么申请
      Windows程序的数字签名证书申请流程包括:准备企业资料(营业执照、税务登记证等),提交申请表及企业资料。经过初审、实名认证和二审后,等待1-5个工作日审核结果。审核通过后,CA机构颁发证书并通过邮件或邮寄方式发送。收到证书后按指南安装并使用签名工具对程序进行数字签名,确保软件完整性和可信度。注意证书有效期、管理和兼容性问题。
      |
      7月前
      |
      自然语言处理 安全 测试技术
      HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
      HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
      362 0
      HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试