【问题标题】:Don't understand the output of this C program不明白这个 C 程序的输出
【发布时间】:2011-09-22 07:19:30
【问题描述】:

代码如下:

#include <stdio.h>

int main (void)
{
    int value[10];
    int index;

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

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

这是编译时的输出:

value[0] = 197
value[1] = 0
value[2] = -101
value[3] = 547
value[4] = 0
value[5] = 350
value[6] = 0
value[7] = 0
value[8] = 1784505816
value[9] = 35

我不明白为什么 value[8] 返回 1784505816? value[8] 不应该是 = value[6] = value[7] = 0 吗?顺便说一句,我在 Mac OS X Lion 下通过 gcc 编译代码。

【问题讨论】:

    标签: c


    【解决方案1】:

    value[8] 从未初始化,因此其内容未定义,可以是任何内容。

    同样适用于value[1]value[4]value[6]value[7]。但它们恰好为零。

    【讨论】:

    • 但是如果你使用int value[10] = {};,那么它们将被零初始化。
    • @ChrisJester-Young:你的意思是{0}。这是一道 C 题。
    • @CharlesBailey:+1 哇,好电话。我看到{} 是一个 gcc 扩展(使用-pedantic 编译时,您会收到“警告:ISO C 禁止空初始化器大括号”消息)。 (唉,我现在编辑我的评论为时已晚。)
    • its contents are undefined?该标准使用术语indeterminate,而不是undefined。看到这个:Fun with uninitialized variables and compiler (GCC)
    【解决方案2】:

    在没有初始化程序的情况下声明的具有自动存储持续时间的对象在分配之前具有不确定的值。从技术上讲,它会导致未定义的行为使用具有不确定值的对象的值(例如打印 int)。

    如果您希望将数组初始化为零,您需要提供一个初始化程序。例如

    int value[10] = {0};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多