2011-09-22 74 views
5

下面的代码的输出:不明白这个C程序

#include <stdio.h> 

int main (void) 
{ 
    int value[10]; 
    int index; 

    value[0] = 197; 
    value[2] = -100; 
    value[5] = 350; 
    value[3] = value[0] + value[5]; 
    value[9] = value[5]/10; 
    --value[2]; 

    for(index = 0; index < 10; ++index) 
     printf("value[%i] = %i\n", index, value[index]); 
    return 0; 
} 

这里的输出时,编译:

value[0] = 197 
value[1] = 0 
value[2] = -101 
value[3] = 547 
value[4] = 0 
value[5] = 350 
value[6] = 0 
value[7] = 0 
value[8] = 1784505816 
value[9] = 35 

我不明白为什么值[8]返回1784505816? 不是值[8]应该是=值[6] =值[7] = 0?顺便说一下,我在Mac OS X Lion下通过gcc编译代码。

回答

20

value[8]从未初始化,因此其内容未定义,可以是任何东西。

同样适用于value[1],value[4],value[6]value[7]。但他们恰好是零。

+8

但是,如果你使用'int值[10] = {};',那么它们将是零初始化。 –

+5

@ ChrisJester-Young:你的意思是'{0}'。这是一个C问题。 –

+0

@CharlesBailey:+1哇,很好的电话。我发现'{}'是一个gcc扩展(当用'-pedantic'编译时,你会得到一个“警告:ISO C禁止空初始化括号”消息)。 (现在编辑我的评论为时已晚,唉。) –

6

在没有初始值设定项的情况下声明自动存储持续时间的对象在分配给它们之前具有不确定的值。从技术上讲,它会导致未定义的行为使用具有不确定值的对象的值(例如,打印int)。

如果您希望将数组初始化为零,您需要提供一个初始化程序。例如。

int value[10] = {0}; 
+0

+1使用术语* indeterminate值*。 – Nawaz