初始化未初始化的值?

时间:2009-08-04 05:24:32

标签: c variables

在C中,自动变量(如果未初始化)保存垃圾值。但是,请考虑以下程序:

int main(){
 signed char term;
 (char)term--;
 printf("%d\n",term);
}

它打印的值为'7'。如果我不执行(char)term--,则会输出值“8”。所以,它肯定没有垃圾价值。这不矛盾吗?

7 个答案:

答案 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'是用于表示垃圾的值之一,这可能是它。但是,考虑到垃圾应该是随机的,一致性很难被忽视。