【发布时间】:2019-04-22 05:57:59
【问题描述】:
我正在阅读C 如何编程,我有一个关于数组的存储类 的问题。书中说:
数组和结构是“静态”实体,因为它们在整个程序执行过程中保持相同的大小(当然,它们可能是自动存储类,因此每个都被创建和销毁定义它们的块进入和退出的时间)
我不确定 blocks 是什么意思,我目前的理解是 function/for/while 是块。我尝试了以下方法:
...
for (size_t i=1; i<=2; i++) {
printf("round %c:", i+'0');
int a[10];
show_array(a, 10); // this is a function that prints all elements of `a`.
for (size_t j=0;j<10;j++) {
a[j]=8;
}
}
我得到了输出:
round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,
似乎int a[10] 是静态的,而不是自动存储类,我是否遗漏了什么? (四种存储类我都懂)
如果您需要此信息,我使用ideone.com 运行我的测试。
【问题讨论】:
-
你认为“自动存储类”是什么意思?
-
32766或-1160481168是“未初始化的值”吗?如果是,为什么8不是? -
我们有很好的证据表明该数组没有静态存储持续时间——任何具有静态存储持续时间的东西都会在程序开始时初始化为 0,除非您将其初始化为其他值。由于您的数组包含像 -1160480784 这样的垃圾编号,因此它不能具有静态存储持续时间(除非您的程序在其他地方出现内存错误)。
-
根据 C 2018 6.8.2 2,复合语句是一个块。复合语句是一对大括号
{和},其中包含声明和/或语句。 -
@user7813604:当一个块的执行结束时,每个与该块关联的具有自动存储持续时间的对象的生命周期结束。当块的另一次执行开始时,在其中创建的每个这样的对象都有一个新的生命周期。每次迭代都是不同的。
标签: c