在我学习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;
}
答案 0 :(得分:1)
你怎么想&#34;未初始化&#34;装置
表示尚未设置该值。 因为它尚未设置,所以可以存储任何值。
也许是0,也许是547 ...... 任何值都是有效的,并且无法保证您会找到什么。
答案 1 :(得分:1)
未初始化的值只是应用程序尚未写入的内存地址。这就像拥有一个周围的人使用的记事本。当你的程序运行时,它会给出一小部分记事本,之前可能已经或可能没有被其他人使用过。如果它(最有可能),那么它仍然会写上一些东西,但可能对你没有任何意义。如果你想知道那里有什么,你必须写点什么。一般来说,我们会给它写0,就像用空纸一样擦除所有内容。
答案 2 :(得分:1)
6.2.4对象的存储持续时间
...
5一个对象,其标识符声明为没有链接且没有存储类 说明符static
具有自动存储持续时间,某些复合文字也是如此。该 尝试间接访问具有自动存储持续时间的对象的结果 与对象关联的线程以外的线程是实现定义的。
6对于没有可变长度数组类型的对象,其生命周期会延长 从进入与之关联的块直到该块的执行结束 无论如何。 (输入一个封闭的块或调用一个函数暂停,但不会结束, 执行当前块。)如果以递归方式输入块,则执行新的实例 每次都创建对象。 对象的初始值是不确定的。如果 为对象指定初始化,每次声明或执行时都会执行 在块的执行中达到复合文字;否则,价值变为 每次达到声明时都不确定。
重点补充。
基本上,具有auto
存储持续时间的对象不会隐式初始化为任何特定值 - 它们具有最后写入该特定内存位置 1 的值。您不能依赖该值为0(或其他任何值)。
上面引用的最后一句适用于这样的情况:
for (;;)
{
int x;
do_something_with( x );
}
循环的每次迭代都会有效地破坏并重新创建x
,并且您不能依赖在循环的任何迭代中写入x
的值来转移到下一次迭代。 在类似x86的系统上的实践中,它很可能会被结转,但不要认为在任何地方都是如此。
请注意,实现可能决定在调试模式下构建时使用某个已知值初始化auto
变量。
<小时/>
答案 3 :(得分:0)
这是C编程101。 C是面向过程的语言,并没有实现面向对象语言(如Java)中存在的某些功能,如“自动”和保证变量初始化。
如果在C中声明一个自动变量(在堆栈上没有动态分配)并且不提供初始值,那么这个变量将具有我们称之为“垃圾值”的值。这是一般行为,但具体实施可能会有所不同。
让我举个例子:
int a; //a variable with no initial value
printf("%d", a);
我们无法预测这会打印出什么。可能是0或可能是其他任何东西。程序也会崩溃。从本质上讲,这是未定义的行为。
如果在Java中完成相同的操作,则肯定会打印0(因为Java默认情况下会将所有整数初始化为0)。
现在讨论你的数组问题:无论是单个整数还是整数数组都无关紧要。您未明确指定值的任何内存位置都将具有“垃圾值”。它可以是0或其他东西。此行为完全取决于机器并且不可预测。
底线是:确保在使用前初始化变量。