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

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

再摸几天,突然发现这里面我不会的挺多的

  • 0 说在前面
  • 1 x86是什么?一种指令集架构
  • 2 变量在内存中的存储
    • 2.1 如何使用监视器和内存工具寻找变量的位置?

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}

232?23=235个位空间,也就是4GB空间了。这个问题在64位处理器里得到了解决,理由就是对于现在而言,

2

64

+

3

2^{64+3}

264+3足够大了。(也许以后128乃至更多才是主流?)
另外,这里cpu对应的寄存器的位只是用于寻址功能,所以其实际容量并不大,只是其能表示的数字大而已,而内存则是实打实的从0000到1111都有空间的。

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

2 变量在内存中的存储

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

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

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