C阵列分配过程 - 一次或单独 - 部分阵列分配 - 不同的输出

时间:2017-11-12 14:46:56

标签: c arrays garbage

#include <stdio.h>

int main()
{
    int a[5]={1} ;
    int b[5];
    b[0]=1 ;
    printf("\na[0]=%d, a[1]=%d, a[2]=%d, a[3]=%d, a[4]=%d",a[0],a[1],a[2],a[3],a[4]);
    printf("\nb[0]=%d, b[1]=%d, b[2]=%d, b[3]=%d, b[4]=%d",b[0],b[1],b[2],b[3],b[4]);

    return 0 ;
}

查看代码。我在两个过程中部分分配了两个整数数组(1个元素分配了5个)。

第一个用括号分配。

通过访问一个数组索引来分配第二个。

然后我打印整个阵列。

在第一个数组中,我在未分配的索引中得到0(零)。在第二个数组中,我在未分配的索引中获得了垃圾值。

请你解释一下。

请不要解释这里发生的事情。但请好好解释一下为什么会这样?原因。

2 个答案:

答案 0 :(得分:1)

使用

int a[5]={1} ;

您将第一个元素初始化为1,其余元素将自动初始化为0

使用

int b[5];
b[0]=1 ;

您没有初始化任何元素,数组的内容(定义后)将不确定。然后,将值1指定给b[0],使数组的其余部分保持未初始化状态。

答案 1 :(得分:1)

这是正确的行为。

int a[5]={1} ; // 1,0,0,0,0

使用这些值初始化数组。

对于第二种情况,仅初始化b[0]。其余元素包含不确定的值。

标准本身的一个例子 6.7.9.27 [N1570]

  

示例4声明

      int z[4][3] = {
            { 1 }, { 2 }, { 3 }, { 4 }
      }; 
     

按指定初始化z的第一列,并用零初始化其余部分。

在标准的同一段中,它说 6.7.9.21

  

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

该标准的规则提到: - 6.7.9.10

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。如果一个对象有静态   或线程存储持续时间未明确初始化,然后:

     
      
  • 如果它有指针类型,则将其初始化为空指针;
  •   
  • 如果有的话   算术类型,它被初始化为(正或无符号)零;
  •   
  • 如果   它是一个聚合,每个成员都被初始化(递归)   根据这些规则,任何填充都被初始化为零位;
  •   
  • 如果是联合,则初始化第一个命名成员(递归)   根据这些规则,任何填充都被初始化为零位;
  •