C:自动存储类的数组?

Bin*_*eee 5 c

我正在阅读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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了输出:

round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,
Run Code Online (Sandbox Code Playgroud)

它似乎int a[10]是静态的,而不是自动存储类,我错过了什么?(我了解四个存储类)

如果您需要此信息,我使用ideone.com运行我的测试.

Tim*_*all 5

你确实错过了什么.a确实有自动存储,并且打印的值是重复使用内存的结果,而不是持久存储的结果.这些值将在调试模式下重置(可能不是所有开发环境都重置,但有些会在每次迭代时将成员设置为0xCCCCCCCC ).此外,好的编译器(大多数编译器,如果你启用所有警告)将告诉你,你在这里使用未初始化的数据.

如果你仍然不相信我,试试这个例子吧.它将显示内存值a被存储的值覆盖b.数组a不再存在于if语句的依赖代码块的末尾,并且所有内存都可供系统使用.在下一次迭代中,它可能会用于数组b,这就是为什么你会看到数组中打印的值为8 b,即使它们被分配给了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了最终确认正在重用内存,您可以修改show_array以打印传入的原始指针,而不仅仅是单个元素.您每次都应该看到相同的地址.