问有人告诉我,如果我评估一个未定义表达式,或者访问一个未初始化的变量,我会得到一个随机的、无意义的值。但我尝试了一下,得到了零。这是怎么回事?
答很难回答这个问题,因为很难看出“意外”的零值引用 supposed to prove 什么。C 确实保证某些值会被初始化为 0(参见问题 1.30),但对于其余的值(当然也包括那些未定义表达式的结果),你确实有可能得到无意义的值。你碰巧得到 0 一次,这并不意味着你错了预期会得到无意义的值,也不意味着你下次可以依赖于此(更不用说你应该编写依赖于它的代码了!)。
操作系统新提供的内存块,以及大多数尚未被触及的栈帧,确实 tend to be zeroed,所以在你第一次访问它们时,它们可能碰巧包含 0,但程序运行一段时间后,这些规律性会迅速消失。(而且,无意中依赖于未初始化变量的偶然初始值的程序可能非常难调试,因为“预期”的值可能碰巧出现在所有小的、简单的测试用例中,而意外的值和伴随的崩溃只发生在更大、运行时间更长、更难跟踪的调用中。)