为什么我的数组中没有值,我没有分配?

时间:2013-01-02 00:24:05

标签: c arrays

#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?

4 个答案:

答案 0 :(得分:6)

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

要进行零初始化,您可以执行以下操作:

int values[10] = {0};

或者,使用memset

答案 1 :(得分:4)

在C中,自动变量永远不会归零。您想要的是memset()您的数组0以避免这种情况。

答案 2 :(得分:3)

在C99中,您还可以仅初始化所需的子对象,其余的将初始化为具有静态存储持续时间的数据(0int):

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

更复杂的初始化不可能/不清楚这样做。比如:

--values[2];

无法在初始化中完成,因为如果同一元素有更多初始值设定项,则只使用最后一个,并且甚至无法评估第一个,导致未初始化值减少。从C11标准:

  

初始化应在初始化器列表顺序中进行,每个初始化器提供给a   特定子对象覆盖同一子对象的任何先前列出的初始化程序;    151)

     

151)被覆盖且因此不用于初始化该子对象的子对象的任何初始化程序可能根本不会被评估。

(我认为这不仅仅是一个脚注......)

但是,我认为这只是一个例子,因为没有必要这样做,在这种情况下你可以将它初始化为350 - 1

答案 3 :(得分:3)

虽然Oli Charlesworth的帖子显示了解决方案,但让我再介绍一下“为什么”。对于在应用程序堆栈上分配的“自动”变量,这种未定义的值非常明显。

虽然操作系统在将程序加载到其中之前倾向于将内存归零,但main()不是C程序实际启动的地方。实际的起始位置隐藏在一些依赖于实现的位置,使得main()中的代码只是程序启动期间一系列函数调用中的最后一次调用。所有这些早期的内部调用都在堆栈中乱涂乱画,留下了混乱。

由于每个函数调用都会继承先前调用中的混乱,因此真正知道在新调用的堆栈中会看到什么。如果堆栈变得足够大,你最终会在未使用的内存中找到操作系统的零,这可能有助于在更大的程序中进行调试,但代码必须永远不依赖于这样的零。

堆栈和堆(例如,malloc())内存都有未知值。