C语言中的全局变量是自动变量吗?

3
我正在学习 ANSI C 编程语言,其中在介绍中提到:
“局部变量通常是‘自动的’,或者说在每次调用时都会被重新创建。”
我猜分配和释放变量是使用 Java 的堆栈帧逻辑。那么全局变量也是自动的吗?它们进入和离开堆栈帧的次数比局部变量少得多,因为它们在整个 .c 文件的范围内。

全局变量具有固定的地址,它们不是自动的。它们在程序开始时分配,并在整个执行过程中保持不变。 - Jean-François Fabre
2
没有使用staticregister(或extern)关键字在函数内定义的变量是auto变量。理论上,它们可以加上关键字auto。如果你真的添加了这个关键字,那么你应该被枪毙(C++已经完全接管了它,用于完全不同的目的)。如果你在生产环境中遇到了这个关键字,你应该把写下auto的人带到后面的小屋子里让他悔过。 - Jonathan Leffler
2
可能是在全局范围内使用自动变量的重复问题。 - Jean-François Fabre
2
@JonathanLeffler,我喜欢您的激进方式。用与在C++中使用“new”创建C-数组的人相同的子弹来射击他们 :) - Jean-François Fabre
1
不,我的意思是使用存储类auto创建全局变量是不可能的。存储类auto排除了变量成为全局变量的可能性;而变量成为全局变量则排除了它成为auto变量的可能性。(在标准C中,使用存储类register创建全局变量也是不可能的;register排除了全局变量的可能性,反之亦然。) - Jonathan Leffler
显示剩余2条评论
1个回答

2

不,这些概念并不相互对立。全局变量是一个非正式的概念,它指的是具有外部链接的变量。按照定义,自动变量没有链接,因此拥有既是自动的又是全局的变量是没有意义的。


值得一提的是,全局变量和局部变量之间的另一个区别是,默认情况下全局变量会被零初始化,如果我没记错的话,而局部变量则是默认初始化,对于原始类型来说,这意味着未定义的值。 - ABu
1
@Peregring-lk:全局变量的情况是正确的。对于局部变量来说,情况更加复杂,因为有多个存储类别说明符。例如,使用 static 关键字的局部变量也会被初始化为零。另一方面,自动变量(那些具有隐式 auto 类别说明符的变量)没有任何隐式初始化——它们在赋值之前是不确定的。 - Grzegorz Szpetkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接