我正在阅读C如何编程,我有一个关于数组存储类的问题。 在书中它说:
数组和结构是“静态”实体,因为它们在整个程序执行期间保持相同的大小(当然,它们可以是自动存储类,因此每次进入和退出它们的块时都会创建和销毁它们)
我不确定哪些块意味着什么,我目前的理解是函数/ 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 [10]是静态的,而不是自动存储类,我哪里错了?
你确实错过了什么。 a确实有自动存储,打印的值是内存被重用的结果,而不是存储持久性的结果。 这些值将在调试模式下重置(可能不是所有开发环境都重置,但有些会在每次迭代时将成员设置为0xCCCCCCCC)。 此外,好的编译器(大多数编译器,如果你启用所有警告)将告诉你,你在这里使用未初始化的数据。
如果你仍然不相信我,试试这个例子吧。 它将显示a中的内存值被b中存储的值覆盖。 数组a在if语句的依赖代码块的末尾不再存在,并且所有内存都可供系统使用。 在下一次迭代中,它可能会用于数组b,这就是为什么你会在数组b中看到8的值,即使它们被分配给a。
for (size_t i=1; i<=2; i++)
{
if( i&1 )
{
printf("round %c:", i+'0');
int a[10];
show_array(a, 10);
for (size_t j=0;j<10;j++) a[j]=8;
}
else
{
printf("round %c:", i+'0');
int b[10];
show_array(b, 10);
for (size_t j=0;j<10;j++) b[j]=888;
}
}
为了最终确认正在重用内存,您可以修改show_array以打印传入的原始指针,而不仅仅是单个元素。 您每次都应该看到相同的地址。