未初始化的变量或数组

时间:2018-04-05 16:32:14

标签: c arrays variables uninitialized-constant

在我学习C的过程中,我开始学习数组,当然,我制作了第一个数组,当然它似乎有点奇怪。所以我已经定义了一个数组并为数组的某些变量赋值。当我显示它们时,来自数组的未初始化变量显示为0,但对于某些未初始化的数组变量,它会显示随机数。有人可以解释这是否正常,为什么会发生(背后的机制)?

=FILTER('[IMPORTED] Database'!A:A, ROW('[IMPORTED] Database'!A:A)=MAX(FILTER(ROW('[IMPORTED] Database'!A:A), NOT(ISBLANK('[IMPORTED] Database'!A:A)))))

和输出:

#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; 
}

4 个答案:

答案 0 :(得分:1)

你怎么想&#34;未初始化&#34;装置

表示尚未设置该值。 因为它尚未设置,所以可以存储任何值。

也许是0,也许是547 ...... 任何值都是有效的,并且无法保证您会找到什么。

答案 1 :(得分:1)

未初始化的值只是应用程序尚未写入的内存地址。这就像拥有一个周围的人使用的记事本。当你的程序运行时,它会给出一小部分记事本,之前可能已经或可能没有被其他人使用过。如果它(最有可能),那么它仍然会写上一些东西,但可能对你没有任何意义。如果你想知道那里有什么,你必须写点什么。一般来说,我们会给它写0,就像用空纸一样擦除所有内容。

答案 2 :(得分:1)

Chapter and verse

6.2.4对象的存储持续时间
...
5一个对象,其标识符声明为没有链接且没有存储类 说明符static具有自动存储持续时间,某些复合文字也是如此。该 尝试间接访问具有自动存储持续时间的对象的结果 与对象关联的线程以外的线程是实现定义的。

6对于没有可变长度数组类型的对象,其生命周期会延长 从进入与之关联的块直到该块的执行结束 无论如何。 (输入一个封闭的块或调用一个函数暂停,但不会结束, 执行当前块。)如果以递归方式输入块,则执行新的实例 每次都创建对象。 对象的初始值是不确定的。如果 为对象指定初始化,每次声明或执行时都会执行 在块的执行中达到复合文字;否则,价值变为 每次达到声明时都不确定。

重点补充。

基本上,具有auto存储持续时间的对象不会隐式初始化为任何特定值 - 它们具有最后写入该特定内存位置 1 的值。您不能依赖该值为0(或其他任何值)。

上面引用的最后一句适用于这样的情况:

for (;;)
{
  int x;
  do_something_with( x );
}

循环的每次迭代都会有效地破坏并重新创建x,并且您不能依赖在循环的任何迭代中写入x的值来转移到下一次迭代。 在类似x86的系统上的实践中,它很可能会被结转,但不要认为在任何地方都是如此。

请注意,实现可能决定在调试模式下构建时使用某个已知值初始化auto变量。

<小时/>

  1. 其机制广泛而多样,不值得进入。

答案 3 :(得分:0)

这是C编程101。 C是面向过程的语言,并没有实现面向对象语言(如Java)中存在的某些功能,如“自动”和保证变量初始化。

如果在C中声明一个自动变量(在堆栈上没有动态分配)并且不提供初始值,那么这个变量将具有我们称之为“垃圾值”的值。这是一般行为,但具体实施可能会有所不同。

让我举个例子:

int a;  //a variable with no initial value
printf("%d", a); 

我们无法预测这会打印出什么。可能是0或可能是其他任何东西。程序也会崩溃。从本质上讲,这是未定义的行为。

如果在Java中完成相同的操作,则肯定会打印0(因为Java默认情况下会将所有整数初始化为0)。

现在讨论你的数组问题:无论是单个整数还是整数数组都无关紧要。您未明确指定值的任何内存位置都将具有“垃圾值”。它可以是0或其他东西。此行为完全取决于机器并且不可预测。

底线是:确保在使用前初始化变量。