未初始化的靜態變量始終在BSS中分配。雖然.bss節是靜態的,因爲在編譯時分配內存。 在許多書籍中,「可執行文件中只有初始化爲非零值的變量才佔用空間」。 將程序加載到內存後,未初始化的靜態變量仍然是.bss。初始化時內存將分配給「未初始化的靜態變量」嗎?
**函數初始化時會發生什麼? ** 它會移動到其他地區嗎?
未初始化的靜態變量始終在BSS中分配。雖然.bss節是靜態的,因爲在編譯時分配內存。 在許多書籍中,「可執行文件中只有初始化爲非零值的變量才佔用空間」。 將程序加載到內存後,未初始化的靜態變量仍然是.bss。初始化時內存將分配給「未初始化的靜態變量」嗎?
**函數初始化時會發生什麼? ** 它會移動到其他地區嗎?
初始化時,內存分配給「未初始化的靜態變量」,這被移動到.data段
代碼文件:
int a,b,c;
int main()
{
a=1;
b=2;
c=3;
scanf("%d",a);
}
執行:
# size a.out
text data bss dec hex filename
1318 284 16 1618 652 a.out
# size core.18521
text data bss dec hex filename
28672 180224 0 208896 33000 core.18521 (core file invoked as ./a.out)
因此,它將移至.data節。 –
.bss不佔用可執行文件中的空間。當程序啓動.bss被分配並填充0時,所有未初始化的對象都位於那裏。所以當你初始化內存被分配的變量時。
報價的休息:
「在可執行文件,只有被初始化爲非零值的變量佔用的空間。」
I.E.當可執行文件被加載到內存中,所需要的空間分配
仔細考慮您的意譯:「正在初始化*爲非零值*佔用空間只有變量」(強調)有關變量的初始化什麼歸零?這些可以在沒有進一步初始化的情況下使用,所以你明顯的解釋是運行時初始化必須改變有關空間分配的事情。正如其他人指出的那樣,您所提到的聲明是關於可執行文件*,而不是關於正在運行的程序在內存中的映像。 –
「未初始化的靜態變量始終在BSS中分配」並非總是如此 –