C语言-数组越界导致的死循环,关于变量在内存中的存储

本文围绕VS2022Debug版本的x86架构,探讨了指令集、变量在内存中的存储方式,包括局部变量和全局变量的区别,以及如何使用内存监视器定位变量位置的调试方法。作者强调了32位和64位处理器在内存容量上的差异以及内存显示的十六进制形式。
摘要由CSDN通过智能技术生成

环境为VS2022,Debug版本-x86
//明天再摸一会

0 说在前面

本文章中的代码严重依赖环境(主要是x86条件),选用debug(调试)的版本是因为多数调试版本下的编译器或解释器不会自动优化代码。

1 x86是什么?一种指令集架构

x86可以指代8位、16位、32位的指令集架构,目前主要指代32位的指令集架构,其中包含寄存器、寻址模式、存储体系等重要的计算机体系结构。

32位指的是32bit,即4个字节(Byte),1个字节8位(bit,也称比特)。具体是指其包含的8个32位的通用寄存器(IA32):EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI。

而cpu从内存中查找数据(寻址)时,是以字节为单位查找的,即cpu中的一个地址就对应着内存中的1个字节(8个位),而cpu自己能表示的地址数受限于寄存器位数,至多表示 2 32 2^{32} 232个地址,故32位cpu能使用的内存最大不超过 2 32 ∗ 2 3 = 2 35 2^{32} * 2^{3} = 2^{35} 23223=235个位空间,也就是4GB空间了。这个问题在64位处理器里得到了解决,理由就是对于现在而言, 2 64 + 3 2^{64+3} 264+3足够大了。(也许以后128乃至更多才是主流?)
另外,这里cpu对应的寄存器的位只是用于寻址功能,所以其实际容量并不大,只是其能表示的数字大而已,而内存则是实打实的从0000到1111都有空间的。

而如果将上述的内存空间原原本本地展开,会非常难看,所以稍后在内存监视窗口中,我们所看见的是两个数字一组表示的1个字节,当然,此时的这两个数字是十六进制的(1个十六进制数字可以展开为至多4个二进制数的组合,比如1100 0001 == C1, 这里是8个二进制数,也就是8bit,即1个字节)。
在这里插入图片描述

2 变量在内存中的存储

局部变量全局变量为何不同?

2.1 如何使用监视器和内存工具寻找变量的位置?

首先使用F9在你希望停下的位置打下一个断点,告诉程序:“待会我调试的时候你要配合我,走到这里就立定,别动,我说之后怎么动,你再照着做。”
然后使用F5开始调试,按下F5之后,断点所在行前面的代码没啥问题的情况下,程序运行会停在断点所在行(此行尚未运行)。
(例子等我明天摸一个)

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值