【问题标题】:Created array not empty in c? [duplicate]在c中创建的数组不为空? [复制]
【发布时间】:2018-07-13 11:57:52
【问题描述】:

我刚刚创建了一个大小为 10 的数组

int array[10];

之后我想检查值

for(int i = 0; i < 10; i++){
printf("%d\n", array[i]);
}

但输出与我的预期不同。我虽然所有的值都应该是 0,但输出显示如下:

1996260900
1
0
1995115336
78836
78796
0
68600
0
0

为什么会这样?
提前致谢!

【问题讨论】:

  • 顺便说一句。我没有修改数组。印刷就在它的结构下面。
  • C 标准不保证未初始化变量的初始值是 0。事实上,你很幸运早在学习​​阶段就遇到了这种情况。一些编译器自动将变量初始化为0,尤其是在调试模式下——因此会无意中隐藏可能的错误。
  • 你得到了垃圾值,因为你只声明了数组并且它没有初始化你可以使用循环从用户这样的扫描值 for(int i=0;iprogramiz.com/c-programming/c-for-loop

标签: c


【解决方案1】:

未初始化的局部和非静态变量(数组或非数组)的内容是不确定的,并且看起来几乎是随机的。不要尝试使用此类值。

如果你想初始化值,那么你需要明确地进行,如

int array[10] = { 0 };  // Will initialize all elements to zero

然后有点挑剔您对术语“空”和数组的用法:数组从不“空”。如果你定义一个有十个元素的数组,那么它总是有十个元素。

请记住,C 没有任何“空值”概念。一切都有一个值,它可能由你初始化或设置,或者它未初始化,在这种情况下,值是不确定的。

【讨论】:

  • 空初始值设定项是不一致的,尽管一些编译器可能会接受它们。传统的方法是使用{0}
【解决方案2】:

来自 C 标准#6.7.9p10:

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。

要用0初始化数组的所有元素,你可以这样做:

int array[10] = {0};

具有静态或线程存储持续时间且显式初始化的int 类型对象被初始化为zero。因此,您可以期望数组array 的所有元素的值都是0,前提是它具有静态存储持续时间,否则数组array 的元素值将是不确定的,您必须显式初始化它们0

【讨论】:

    【解决方案3】:

    当你声明数组时,你没有初始化它。所以,它被垃圾值初始化了。而且,您正在打印垃圾值。

    " 这仅在局部变量的情况下发生。由于局部变量的内存是在堆栈上分配的,并且在分配内存时,运行时系统在将内存分配给变量之前不会清除内存,这与在堆中分配内存的情况不同全局变量和静态变量。因此,局部变量的默认值成为其在堆栈上的内存内容,而常量和静态变量的默认值为0。"

    引自here

    【讨论】:

    • 数组没有“被垃圾值初始化”,它根本没有被初始化,所以它包含 indeterminate 值(在标准的语言中)。此外,堆栈和堆不是 C 语言级别的细节,而是实现级别的细节。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2019-12-25
    • 2011-09-15
    相关资源
    最近更新 更多