C填充数组而不被要求

时间:2018-02-07 20:17:46

标签: c arrays

我在C中玩一些基础知识。我有一个数组,我在位置0,1,2,3,4,5填充一个基本的for循环。问题是:当我尝试将其打印出来时,它会在我从未打算触及的位置打印出奇怪的值(位置6-13)。

代码:

#include <stdio.h>

#define MAXSIZE 16

int main()
{
  int array[MAXSIZE];
  int array2[MAXSIZE] = {0, 1, 2, 3, 4, 5};

  int i;

  for(i = 0; i < 6; i++)
  {
        array[i] = i;
  }

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

  printf("\n");

  for(i = 0; i < sizeof(array2) / sizeof(int); i++)
  {
        printf("%d", array2[i]);
  }

 // printf("%lf\n", array[2]);

  return 0;
}

输出:

0 1 2 3 4 5 822123896 32766 810140152 32643 816205824 32643 816288200 32643 0 0

0 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0

注意:array是问题所在。 array2只是另一个似乎正常工作的测试人员。这只是内存在C中运行的方式吗? 为什么array中的最后2个值会回到'0'那么?!

3 个答案:

答案 0 :(得分:8)

Filter尚未初始化,并且未在文件范围内定义,因此其值不确定。您稍后值分配给数组的某些元素,但这与初始化不同。

然后打印完整数组时,会打印这些不确定的值。至于为什么这些值中的一些是0,因为所有未分配的值都是不确定的,0与任何其他值一样好。另请注意,不确定值可能是陷阱表示,这意味着它不是该数据类型的有效表示形式。如果尝试读取陷阱表示,则调用未定义的行为。

相反,array 初始化。您为数组的前6个元素赋值,其余元素初始化为0。

答案 1 :(得分:-1)

  

注意:array1是问题所在。 array2只是另一个测试人员,似乎工作正常。这只是内存在C中运行的方式吗?为什么array1中的最后2个值回到'0'那么?!

这是未定义的行为,您的程序可以随意执行任何操作。

答案 2 :(得分:-1)

C99 Section 6.7.8 Initializers

  

1671 如果括号括起的列表中的初始值设定项少于   有聚合的元素或成员,或者有更少的字符   用于初始化已知大小的数组的字符串文字   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。

默认情况下static int 0 。这就是array2落后 0 的原因。