gpt4 book ai didi

c - 如果未初始化,自动变量是否具有静态生命周期?

转载 作者:太空狗 更新时间:2023-10-29 15:40:59 26 4
gpt4 key购买 nike

我很清楚静态局部变量的概念:全局生命周期,局部作用域。同样,我理解自动变量是在程序流进入和离开变量上下文时自动分配/解除分配的。

#include <stdio.h>

void test_var(void){
static unsigned foo = 0;
unsigned bar = 0;
printf(" %u %u\n", foo++, bar++);
}

int main(void){
printf("Foo Bar\n");
printf("--- ---\n");
for(unsigned x = 0; x < 10; x++){
test_var();
}

return 0;
}

因此,前面的示例按预期运行并打印以下输出:

Foo Bar
--- ---
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

让我感到困惑的是变量在未初始化时的行为方式:

#include <stdio.h>

void test_var(void){
static unsigned foo; /* not initialized */
unsigned bar; /* not initialized */
printf(" %u %u\n", foo++, bar++);
}

int main(void){
printf("Foo Bar\n");
printf("--- ---\n");
for(unsigned x = 0; x < 3; x++){
test_var();
}

return 0;
}

输出:

Foo Bar
--- ---
0 2
1 3
2 4
3 5
4 6
5 7
6 8
7 9
8 10
9 11

所以 static 变量 的行为符合预期——获取默认值 0 并通过函数调用保持不变;但是 automatic 变量 似乎也一直存在——尽管它持有一个垃圾值,但它会在每次调用时递增。

发生这种情况是因为该行为在 C 标准未定义,还是标准中有一组规则可以对此进行解释?

最佳答案

C 标准规定对象的生命周期是保证其存储的时间(例如,参见 ISO/IEC 9899:TC3 的 6.2.4)。静态变量和全局变量的生命周期贯穿整个程序,为此,标准保证了上述行为。这些值在程序启动前被初始化。对于自动对象,对象也位于一个不变的地址,但只能在其整个生命周期内得到保证。因此,尽管 bar 在多个函数调用中似乎仍然存在,但您不能保证。这也是为什么你应该总是初始化你的变量,在你使用它之前你永远不知道哪个变量在同一个地方。

我稍微调整了程序以同时打印静态和局部变量的地址:

#include <stdio.h>

void test_var(void){
static unsigned foo; /* not initialized */
unsigned bar; /* not initialized */
printf(" %u %u\t%p\t %p\n", foo++, bar++, &foo, &bar);

}

int main() {
printf("Foo Bar\n");
printf("--- ---\n");
for(unsigned x = 0; x < 3; x++){
test_var();
}

return 0;
}

这在我的电脑上产生了以下输出:

Foo Bar
--- ---
0 33616 0x1067c 0xbee894fc
1 33617 0x1067c 0xbee894fc
2 33618 0x1067c 0xbee894fc

这表明在我的机器上,静态 foo 和自动 bar 每次调用都在相同的各自地址,但这是巧合,C 标准没有'保证 bar 始终位于同一地址。

关于c - 如果未初始化,自动变量是否具有静态生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16571741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com