2013-01-02 49 views
0
#include <stdio.h> 

int main(void) 
{ 

    int values[10]; 
    int index; 

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

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

    return 0; 
} 

为什么我在未分配的元素1,4和6-8中有值?我没有分配任何值。如何在空时自动分配0?为什么我的数组中没有赋值的值?

+0

要添加到奥利的答案,只*总是*初始化变量。在你的例子中,'index'的声明也放在'for'语句的第一个表达式中。在极少数情况下,初始化变量可能会降低性能,但通常情况下,这应该不是什么大问题。 –

回答

6

你没有分配它们,所以你只要得到那些垃圾已经在这些位置的记忆。

要零初始化,你可以这样做:

int values[10] = {0}; 

或者,使用memset

+0

非常感谢。这个小小的补充帮助。 – Martin

4

在C中,自动变量不会归零。你想要的是memset()你的阵列到0,以避免这种情况。

+0

我在哪里添加此行? – Martin

+0

声明数组后,但我建议你看看@OliCharlesworth的答案,这很容易;) – fge

3

从C99还可以初始化只有你所需要的子对象,其余的将被初始化为具有静态存储持续时间数据(0int):

int values[10] = 
{ 
    [0] = 197, 
    [2] = -100, 
    [5] = 350, 
    [3] = values[0] + values[5], 
    [9] = values[5]/10 
}; 

更复杂的初始化是不可能的/不清楚这样做办法。事情是这样:

--values[2]; 

不能在初始化完成,因为如果有对同一元素的更多初始化,只有最后将被使用,并且第一批甚至不能进行评估,对未初始化值造成的减量。从C11标准:

在初始化列表顺序应发生的初始化,设置用于 特定子对象重写为同一子对象任何前面列出的初始化每个初始化; 151)

151)不限初始化为其无效,所以不用于初始化子对象可能不是在所有被评估的子对象。

(我认为它值得有一英尺音符更多...)

不过,我认为这只是一个例子,因为没有一点的话,你可以在这个初始化为350 - 1案件。

+1

我知道这是合法的,我不知道是从哪种版本的C语言? C99或更早版本? – fge

+0

让我检查,我会将它添加到答案 – effeffe

+0

@fge自C99以来。 –

3

虽然奥利查尔斯沃斯的文章显示的解决方案,让我多介绍一点“为什么”。

虽然操作系统在将程序加载到其中之前往往将内存归零,但main()并不是C程序实际启动的地方。实际的起始位置被埋在一些实现依赖的地方,使得main()只是程序启动期间调用的一系列函数中的最后一个。所有这些早些时候的内部通话都在堆栈中乱写,留下了他们的混乱。由于每个新的调用都继承了之前的任何内容,因此您可以看到这一点。如果堆栈增长得足够大,最终将在未使用的内存中找到操作系统的零,这可能有助于在较大的程序中进行调试,但代码不能依赖于这样的零。

相关问题