在C中,自动变量(如果未初始化)保存垃圾值。但是,请考虑以下程序:
int main(){
signed char term;
(char)term--;
printf("%d\n",term);
}
它打印的值为'7'。如果我不执行(char)term--
,则会输出值“8”。所以,它肯定没有垃圾价值。这不矛盾吗?
答案 0 :(得分:15)
那是垃圾。你得到8作为垃圾,减去得7。
这是未定义的行为。仅仅因为你持续获得8并不意味着它的定义很明确。尝试在代码中执行更复杂的操作。在char
上方和下方添加变量。
关于你的“测试”,你说:
然而,考虑到垃圾应该是随机的,一致性很难被忽视。
你需要检查你的假设。 “垃圾应该是随机的”谁说?根据垃圾应该随机怎么办?垃圾随机的唯一方法是系统是否定期通过内存并为其分配随机数。
当我们说“随机”时,我们的意思是我们不知道它会是什么。这并不能使它成为非确定性的。这些是电脑。如果你告诉他们一遍又一遍地做同样的事情,那么会一遍又一遍地做同样的事情。
您的编译器和设置会生成相同的代码,最终会为您提供这些垃圾值。确定性,但你不能依赖这种行为:“随机”。
另外,1-800对你来说并不意味着像你一样。 “8”并不一定表示垃圾,就像设置事物一样,你的编译器用8填充它们。他的意思是8就像任何其他数字一样垃圾。
答案 1 :(得分:4)
值8包含在被视为“垃圾”或“未初始化”的数字集中。
答案 2 :(得分:2)
就值而言,垃圾是某些先前函数在堆栈上留下的内容。更改libc或任意数量的东西,该数字将会改变。
答案 3 :(得分:2)
你似乎把“垃圾”和“非确定性”这两个术语搞混了。术语中的值被认为是垃圾,因为您无法控制其中的值。它可以从平台更改为平台或运行运行,即未定义的行为..
另一方面,如果程序运行时环境中的所有内容都相同,则每次运行的值可能都相同。但是,这并不妨碍它成为垃圾。
答案 4 :(得分:0)
它保存垃圾,它保存8位垃圾,并从0-255读取二进制数字(假装使用无符号字符)。
所以内存可能是这样的:
| 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 |
它结束了(1 0 0 1 0 1 0 1)并将其读作数字,即149.它只取决于指定长度的点中的随机二进制数(例如:unsigned char = 1个字节)
如果它是unsigned int,则需要4个字节的随机垃圾并将其作为数字。
答案 5 :(得分:0)
将其视为使用任意值(位模式)进行初始化。
该任意值取决于变量的堆栈位置最后使用的位置,它绝对不是随机值。它可能或可能不总是相同的值。它可能取决于之前发生的任何事情。
最好始终初始化自动变量以避免未定义的行为。
答案 6 :(得分:0)
感谢您的回答。我尝试了一点修改:
int main(){
signed char term1;
signed char term2;
signed char term3;
printf("%d\n%d\n%d\n",term1,term2,term3);
}
我在3台不同的机器上运行程序。结果在所有3台机器上都相同:term1得到值= -124,term2 = 4,term3 = 8.如果我删除term3,term1 = 4,term2 = 8.如果我删除term2,term1 = 8.所以,基本上,作为signed char去掉的最后一个值得到值'8'。正如1800 INFORMATION所说,'8'是用于表示垃圾的值之一,这可能是它。但是,考虑到垃圾应该是随机的,一致性很难被忽视。