【发布时间】:2020-04-14 08:32:20
【问题描述】:
我知道在 C 语言中,变量定义和声明都是类似的,除非我们使用关键字 extern,例如在以下代码中:
extern int i;
int main () {
..
int i = 1;
..
}
我知道“i”是在“main”外部声明的,但它的内存是在“main”内部分配的。我有两个问题: (i) i 是堆栈变量还是数据段上的变量(全局变量)? (ii) i 的范围是什么?如果两个文件的可执行文件在运行时链接在一起,是否可以在上述 .c 文件之外看到,或者我们是否需要 extern int i;每个文件中的声明?
请帮忙?我不熟悉 C/C++ 以外的语言;因此我很难理解变量定义和变量声明之间的区别。
【问题讨论】:
-
我已经很久没有写过任何 C 语言了,但据我回忆,答案是你有两个变量叫做 'i' - 一个在主函数本地定义,另一个是应该在其他文件中定义。
-
我知道 'i' 是在 'main' 外部声明的,但它的内存是在 'main' 内部分配的。不,不完全是。声明了 两个 不同的
i变量。一个是外部全局变量i(假设在别处声明),另一个是main函数的本地变量。所以,是的,堆栈上有分配给本地i的内存,但它与分配给外部i的全局内存不同。当您在main中引用i时,它看到的是本地的,而不是全局的。 -
同一个标识符可以在程序的不同点表示不同的实体。在
main函数之外声明的变量i具有 文件范围 和 外部链接 。在main函数内部定义的变量i具有块作用域 和无链接。这是两个不同的实体。 -
'我知道'i'是在'main'外部声明的,但它的内存是在'main'内部分配的:false。你有两个变量。 (i) 有两个
is,所以答案是“两者”。 (ii)extern i的作用域是全球性的;本地方法i的范围是本地方法。