打印未初始化的数组索引给出非零

时间:2016-04-02 00:12:40

标签: c

我正在尝试在7.1

中重新创建示例c programming by stephen kochen
#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;
}

预期输出应为

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

但我收到的输出是相同的,除了values[8]的值不匹配。我收到的价值是values[8] = 1501817896。我无法弄清楚为什么?

因为看起来有点混乱。这是我收到的输出

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

3 个答案:

答案 0 :(得分:1)

您尚未初始化values[8]以及更多(并且它们具有不确定的价值)。

为什么不好

C99第6.7.8节初始化:

  

如果自动存储持续时间的对象已初始化   显然,它的价值是不确定的。

第3.18节未定义的行为:

  

使用不可移植或错误的程序构造时的行为   错误的数据,或不确定的对象,为此   国际标准没有要求。

因此,在C中访问未初始化的值为Undefined behaviour,可能会打印任何值或可能会陷阱。

<强>修正

  1. 将您的声明更改为:

    int values[10] = {0};
    
  2. 明确初始化所有未初始化的值。

  3. 将数组移至全局范围或将其设为static

答案 1 :(得分:0)

您未初始化values;你只是使用它。这是不确定的行为,无论作者声称什么,因此,您无法对values[8]作出任何您未设定的假设。

<小时/> 的修改

它不是真正未定义的行为(包括崩溃等),但是从未初始化的变量获得的值只是非确定性的。

在您的情况下,这意味着您的程序不会崩溃(因为它不会访问不存在的内存),而是您没有设置值的索引的输出不确定。

答案 2 :(得分:0)

使用它来了解发生这种情况的原因。

#include<stdio.h>
int main(void)
{
  //int values[10] = {0};
  int values[10];
  int index;
  for(index=0;index<10;++index)
    printf("values[%i] = %i \n",index,values[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;
}

在我的机器上,我得到以下内容......

values[0] = 0 
values[1] = 0 
values[2] = 0 
values[3] = 0 
values[4] = 0 
values[5] = 0 
values[6] = 0 
values[7] = 0 
values[8] = 1553679856 
values[9] = 32767 
values[0] = 197 
values[1] = 0 
values[2] = -101 
values[3] = 547 
values[4] = 0 
values[5] = 350 
values[6] = 0 
values[7] = 0 
values[8] = 1553679856 
values[9] = 35 

我的values[8]也未设置为0。这是因为C在分配时没有零值数组。为此,您可以使用此

int values[10] = {0};

如果它是动态数组使用

int values = calloc(10, sizeof(int));

许多人多年的调试时间都花在了这些问题上。