[英]Why local variable is initialized to zero
據我所知,局部變量是未初始化的,即它包含垃圾值。 但是下面的程序給出0(零)作為輸出。
main()
{
int i;
printf("%d\n",i);
}
當我在上面的程序上運行時,它總是給出0。我知道0也是一個垃圾值,但是每次我得到的輸出都是零。 有人知道原因嗎?
垃圾值表示該內存位置中發生的任何事情。 在您的情況下,該值恰好為零。 在另一台機器上可能並非如此。
請注意,某些編譯器會為調試目的(例如0xA5A5
)填充一些不可思議的值,但通常也不為零。
當我在上面的程序上運行時,它總是給出0。我知道0也是一個垃圾值,但是每次我得到的輸出都是零。
無論什么原因導致0寫入到i
現在所在的位置,都可能在每次程序運行時發生。 這樣的計算機就很好而且可靠。 “垃圾”不一定表示“隨機”或“總是在變化”,而僅表示“在我關心的任何情況下都沒有意義”。
我認為這只是一個意外。 局部變量的確未初始化,但是您的編譯器為(int i)變量分配的內存以前未被當前進程使用,因此沒有垃圾值。
運氣! 該行為是不確定的,因此答案取決於您的編譯器和系統。 這次,您碰巧很幸運,該內存區域中的前四個字節為零。 但是,不能保證從一個系統到下一個乃至從一個調用到下一個始終都會這樣做。
始終打印為0的可能原因是, main
以良好定義的狀態啟動; 更確切地說,ELF程序從定義良好的堆棧(由ELF規范定義)開始並進行注冊,因此它的_start
函數(來自crt*.o
)(是ELF可執行程序的起點)將獲得定義良好的堆棧,並調用main
。
嘗試將函數命名為其他名稱,然后以各種狀態調用它(例如,以更復雜的方式從main
多次調用它)。 還嘗試使用其他程序參數和環境運行程序。 您可能會觀察到i
不同值
您的程序表現出一些未定義的行為 (並且啟用了所有警告后, gcc -Wall
會警告您)。
據我所知,Linux中未初始化的變量首先在“零頁”(一個僅包含零的特殊頁)中“分配”。
然后,在第一次寫入單元化變量時,該變量從零頁移動到另一個不受寫保護的頁。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.