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 ++中已知列的时间一次动态地分配一行二维数组