全局静态和本地静态在何时何地进行存储和初始化?

包括

static int i = 10; int main() { static int i = 20; printf ( "i = %d\n", i ); return 0; } 

有两个静态变量,一个在全局范围内,另一个在函数范围内。 编译器没有抛出“多重定义”错误。 你能告诉我两个静态变量存储在哪里吗?

这两个变量是分开存储的,因为它们是不同的 – 编译器的问题是确保它们是分开的。

变量都是在程序启动之前初始化的 – 这是C,而不是C ++,其中规则略有不同。

如图所示,在main()内部,您无法访问全局变量i (同样,这是C,而不是C ++)。

GCC的-Wshadow编译器标志会警告你关于本地i影响全局的那个。

这些变量称为“符号”,在编译表时会生成“符号表”。 这个表包含每个符号的名称,类型,范围和内存指针(这是最小的,你通常有一堆更多的东西),并且每次引用特定范围内的符号时,它都被替换为表的索引。 这些索引是唯一的,名称和范围的组合也是如此。

简而言之,变量的名称只是装饰,在编译器内部使用符号表和索引。 在程序启动期间通过迭代指向它们的指针表并将正确的值放在适当位置来初始化静态。