static int i = 10;
int
main()
{
static int i = 20;
printf ( "i = %d\n", i );
return 0;
}
有两个静态变量,一个在全局范围内,另一个在函数范围内。编译器没有抛出“多重定义”错误。 你能告诉我两个静态变量的存储位置吗?
答案 0 :(得分:3)
这两个变量是分开存储的,因为它们是不同的 - 编译器的问题是确保它们是分开的。
变量都是在程序启动之前初始化的 - 这是C,而不是C ++,规则略有不同。
如图所示,在main()
内,您无法访问全局变量i
(同样,这是C,而不是C ++)。
GCC的-Wshadow
编译器标志会警告您关于全局的i
阴影。
答案 1 :(得分:0)
这些变量称为“符号”,在编译表时会生成“符号表”。这个表包含每个符号的名称,类型,范围和内存指针(这是最小的,你通常有一堆更多的东西),每次引用特定范围内的符号时,它代替表的索引。这些索引是唯一的,名称和范围的组合也是如此。
简而言之,变量的名称只是装饰,在编译器内部使用符号表和索引。在程序启动期间通过迭代指向它们的指针表并将正确的值放在适当的位置来初始化静态。