C数组分配过程-一次或单独-部分数组分配-不同的输出[重复]

Posted

技术标签:

【中文标题】C数组分配过程-一次或单独-部分数组分配-不同的输出[重复]【英文标题】:C Array Assign Procedure - At once or Individual - Partial Array assignment - Different output [duplicate] 【发布时间】:2018-04-25 07:07:00 【问题描述】:
#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 ;

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

第一个用大括号一次性赋值。

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

然后我打印整个数组。

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

请你解释一下。

请不要解释这里发生了什么。但请解释为什么会这样?原因。

【问题讨论】:

不,有人问如何分配 sam 元素。但这里的问题是。如果我不以多种方式分配整个数组。为什么价值观不同。原因。 :) 【参考方案1】:

int a[5]=1 ;

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

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

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

【讨论】:

【参考方案2】:

这是正确的行为。

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

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

该标准的规则提到:- 6.7.9.10

如果具有自动存储持续时间的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:

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

【讨论】:

以上是关于C数组分配过程-一次或单独-部分数组分配-不同的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在c / c ++中已知列的时间一次动态地分配一行二维数组

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

如何在 NUMA 机器上的不同节点上分配数组的一部分?

如何在一个分配 C 中动态分配二维数组

C:指向结构指针数组的指针(分配/解除分配问题)

在Javascript中将类分配给数组