今天我刚刚在班上做了一次考试---读取C代码和输入,并且所需的答案是如果程序实际运行将在屏幕上显示。声明a[4][4]
为全局变量的问题之一,在该程序的某个点,它试图访问a[27][27]
,因此我回答了诸如“访问其边界之外的数组是未定义的行为”之类的问题,但是老师说a[27][27]
它将具有的值0
。
之后,我尝试了一些代码来检查“所有未初始化的golbal变量都设置为0
”是否正确。好吧,这似乎是真的。
所以现在我的问题是:
a[27][27]
是0
所有环境?编辑:
在该代码中,a[4][4]
是唯一声明的全局变量,并且中还有更多局部变量main()
。
我在DevC ++中再次尝试了该代码。他们都是0
。但这在VSE中是不正确的,0
正如Vyktor指出的那样,在大多数VSE中,只有一些具有随机值。
您说对了:这是未定义的行为,您不能指望它总是在产生0
。
至于为什么在这种情况下看到零的原因:现代操作系统将内存分配给进程中相对粗粒度的块(称为页面),这些块比单个变量大得多(在x86上至少为4KB)。当您有一个全局变量时,它将位于页面上的某个位置。假设a
类型为,int[][]
并且int
s为系统上的四个字节,a[27][27]
则从的开头开始大约500个字节a
。因此,只要a
在页面的开头附近,访问a[27][27]
就会被实际的内存支持,并且读取它不会导致页面错误/访问冲突。
当然,您不能指望这一点。例如,如果a
前面有将近4KB的其他全局变量,a[27][27]
则将不由内存支持,并且当您尝试读取它时,过程将崩溃。
即使进程没有崩溃,您也不能指望获得该值0
。如果您在现代的多用户操作系统上有一个非常简单的程序,除了分配该变量并输出该值外什么也不做,您可能会看到0
。在将内存移交给进程时,操作系统会将内存内容设置为某个良性值(通常为全零),以使来自一个进程或用户的敏感数据不会泄漏到另一个进程或用户。
但是,不能完全保证读取的任意内存为零。您可以在未分配内存的情况下在平台上运行程序,并且会看到从上次使用开始碰到的任何值。
另外,如果a
后面跟随着足够多的初始化为非零值的其他全局变量,则访问a[27][27]
将向您显示那里恰好有任何值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句