所有,
请考虑以下代码:
void func(void)
{
int a;
printf ("%d", a);
}
int main(int argc, char **argv)
{
int a = 3;
func();
printf("%d", a);
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,输出应该是:
<junk value><3>
Run Code Online (Sandbox Code Playgroud)
任何人都可以确认我的理解吗?我的基本查询是,编译器是否引用已声明但未定义的变量的外部作用域?
问候,黑暗
Ste*_*hen 10
你的理解是正确的. func
的a
被初始化堆垃圾.
每次你说int a;
,它都会创建一个新变量,与封闭范围或来自调用堆栈上方其他函数的变量的类似命名变量无关.
在你的理由中,你会混淆范围和范围.c使用词法范围,因此虽然main
通过执行存在"范围"(或生命周期)func
,但它是一个完全不同的范围,因此它指的是一个完全不同的变量.
请注意,"外部作用域"通常是您外部的大括号,最外层作用域是文件级别.
int a; // global
void func(int a) { // parameter
int a; // function local
while (0) {
int a; // scoped in the 'while'
if (true) {
int a; // scoped in the 'if'
}
}
}
Run Code Online (Sandbox Code Playgroud)
那些"A"变量中的每一个阴影它上面的其他"一的.
异常(可能是您的混淆的来源)是声明的变量extern int a;
.此变量特指来自其他位置的变量(不同的翻译单元).一个外部声明可以被用来让你没有想到的行为:
外部变量也可以在函数内声明.在这种情况下,您必须使用extern关键字,否则编译器会将其视为局部变量的定义,该变量具有不同的范围,生命周期和初始值.此声明仅在函数内可见.
"堆栈垃圾"规则的例外情况是,static
堆分配的变量初始化为零(如果我没有记错,这是由标准强制执行的).
并且还要注意"垃圾值"可能是3.