C 局部变量的自动初始化
我有以下代码片段C 局部变量的自动初始化,c,variables,scope,initialization,C,Variables,Scope,Initialization,我有以下代码片段 int j; printf("%d",j); 正如所料,我得到了一个垃圾值 32039491 但是当我在上面的代码片段中包含一个循环时,比如 int j; print("%d",j); while(j); 我在程序的多次试验中得到以下输出 0 我一直认为局部变量在默认情况下被初始化为垃圾值,但在使用循环时,变量看起来会自动初始化。它具有不确定值。它可以是任何东西 引用C11§6.7.9 如果没有显式初始化具有自动存储持续时间的对象,则其值为 不确定的[……] 除非显式初始化
int j;
printf("%d",j);
正如所料,我得到了一个垃圾值
32039491
但是当我在上面的代码片段中包含一个循环时,比如
int j;
print("%d",j);
while(j);
我在程序的多次试验中得到以下输出
0
我一直认为局部变量在默认情况下被初始化为垃圾值,但在使用循环时,变量看起来会自动初始化。它具有不确定值。它可以是任何东西 引用
C11
§6.7.9
如果没有显式初始化具有自动存储持续时间的对象,则其值为
不确定的[……]
除非显式初始化,否则自动局部变量将包含不确定值。如果您试图在变量保持不确定值时使用该变量
- 没有地址
- 可以有陷阱表示
你想错了,你也得出了错误的结论。这两个代码片段在单独运行时都会显示未定义的行为。您不能安全地依赖任何特定的结果。我使用的是VC++6.0 IDE和编译器,不会得到不同的结果。垃圾值根据其定义是垃圾。您不能依赖它们具有特定的值。gargabe值可以是包含0的任何内容。您无法知道这是未定义的行为,因为我们无法根据OPs代码确定范围。类似地,您不能假设OP使用的是具有陷阱表示的系统。因此,这可能是错误的:“当您使用未初始化对象的不确定值时,您会得到未定义的行为”@伦丁,谢谢你指出这一点。我对答案稍加限定,以允许自己拥有我认为足够的黄鼠狼空间。任何对我为什么这样做感兴趣的人(即行为未定义的细节)都可以按照您提供的链接进行操作。如果OPs代码中的变量具有自动存储持续时间(我们无法确定),则访问它们是未定义的行为,但不是因为陷阱表示@谢谢你的指点,先生,更新了我的答案,现在好点了吗?