[英]where and when do the global static and local static get stored and initialized?
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
遮蔽全局的。
這些變量稱為“符號”,在編譯表時會生成“符號表”。 該表包含名稱,類型,作用域和指向每個符號的內存指針(就像最小符號一樣,您通常會有很多東西),並且每次在特定作用域中對符號進行引用時,它都會被替換表的索引。 這些索引是唯一的,名稱和范圍的組合也是唯一的。
簡而言之,變量的名稱只是修飾,內部編譯器使用符號表並對其進行索引。 在程序啟動期間,通過遍歷指向它們的指針表並將正確的值放在適當的位置來初始化靜態函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.