C中的自动存储类

时间:2016-09-30 17:24:42

标签: c

在C中,自动存储类的变量具有初始值作为垃圾值。但是以下列方式声明的变量每次都为所有这些变量赋值,而它应该是一个垃圾值。

this.form.reset();

2 个答案:

答案 0 :(得分:3)

auto int i;
printf("%d",i);

此处不需要关键字auto;它指定了一个默认的存储类。

上面代码的行为明确未定义。请参阅N1570 6.3.2.1第2段。措辞有点密集,但它描述了左值(基本上是指定对象的表达式)是如何被转换的#34;到存储在对象中的值 - 在这种情况下,相关对象是i

  

如果左值指定一个自动存储持续时间的对象   可以使用 register 存储类声明(从来没有   它的地址),并且该对象未初始化(未声明   使用初始化程序并且之前未执行任何赋值   使用),行为未定义。

i中存储的值是任意的,实际上,检索该值很可能会给您一些看似int值的内容,但行为访问是未定义的,这意味着标准没有说明实际发生的事情。编译器可以完全拒绝该程序,或者printf调用的输出原则上可以是蓝色的超智能阴影(后者肯定不太可能)。

如果访问检索存储在该块内存中的任何值,则0与任何其他值一样可能,可能更多。明天运行相同的程序时,您可能会获得不同的值。

(N1570是2011 ISO C标准的最新公开草案。)

答案 1 :(得分:-1)

根据C11 standard (as of N1570)

第6.7.9节,第10节

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为 indeterminate

第3.19.2节

  

不确定价值

     

未指定值或陷阱表示

第3.19.3节

  

未指定的值

     

本国际标准规定的相关类型的有效值否   要求在任何实例中选择哪个值

(这只有很小的改动,与C99中的措辞相同。)

换句话说,取决于编译器或偶然值是什么。可能会发生这样的情况:您使用的编译器对变量施加了额外的限制,并将它们默认为某个值。