该链接指出“当自动数组或结构具有部分初始化程序时,其余部分将初始化为0”。我决定尝试阅读并编写以下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
//int arr[3] = {2}; // line no. 7
struct s {
int si;
int sj;
};
struct s myStruct;
myStruct.si = 9;
printf("%d\n", myStruct.sj);
}
我不明白为什么4096
在注释掉时打印(我相信是一些“垃圾”值),line no. 7
而0
在取消注释时却得到打印line no. 7
。我认为arr
声明与main()
的激活记录(或更确切地说myStruct
)没有任何关系(应该没有line no. 7
注释):
---------------
| Saved PC |
---------------
| arr[2] |
---------------
| arr[1] |
---------------
| arr[0] |
---------------
| si |
---------------
| sj |
---------------
有人可以解释一下我在这里缺少什么吗?
执行此操作时:
struct s myStruct;
myStruct.si = 9;
您尚未初始化 myStruct
。您无需初始化就声明它,然后运行一条语句来设置一个字段。
因为该变量未初始化,所以其内容是不确定的,而读取它是未定义的行为。这意味着看似无关的更改可以修改此行为。在您的示例中,添加一个额外的变量恰巧导致myStruct.sj
其为0,但不能保证会如此。
要初始化变量,必须在定义变量时为其赋值:
struct s myStuct = { 9 };
一个您执行此操作,然后您将看到myStruct.sj
设置为0 的内容。这是根据C标准的 6.7.8节保证的(针对此情况的突出显示):
10如果未自动初始化具有自动存储期限的对象,则其值不确定。如果具有静态存储持续时间的对象未显式初始化,则:
—如果具有指针类型,则将其初始化为空指针;
— 如果具有算术类型,则将其初始化为(正数或无符号)零;
— 如果是集合,则根据这些规则(递归)初始化每个成员;
—如果是联合,则根据这些规则(递归)初始化第一个命名成员。
...
21 如果用大括号括起来的列表中的初始化程序少于聚合中的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于该数组中的元素,则聚合的其余部分应该与具有静态存储持续时间的对象隐式初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句