簡體   English   中英

當 for 循環在 C 中結束時,計數器變量會發生什么

[英]What happen to counter variable when a for loop ends in C

我必須實現一個可以在執行時處理主內存的算法,我想知道這樣聲明的變量會發生什么(我指的是int i ):

for(int i=0; i<100; i++){
    .....
}

在 for 語句的末尾,它是保存在內存中還是以某種方式“釋放”?

對於在for語句內聲明的變量,其生命周期在for語句執行結束時結束。 生命周期是程序執行的一部分,在此期間內存為 C 計算模型中的對象保留。

實現該模型時,編譯器理論上可以在for語句開始時為您在堆棧上顯示的i分配空間(通過調整棧頂指針),並可以在語句結束時通過反向調整釋放該空間。 實際上,大多數普通編譯器計划執行整個函數並在函數啟動時設置一個堆棧幀,並在函數結束時拆除該堆棧幀(有一些例外,例如可變長度數組)。 在該函數中,根據編譯器的設計,該堆棧幀的內存被共享用於各種目的。

這意味着,當for循環執行結束時,可能不會立即對堆棧指針進行調整。 但是, i變量的內存可能會或不會立即重新用於其他目的,這取決於該函數正在執行的其他計算以及編譯器如何安排事情。

這是假設內存完全用於i 雖然變量在 C 標准使用的計算模型中使用內存,但允許編譯器生成任何代碼以獲得相同的可觀察行為。 (對於簡單的程序,可觀察到的行為主要是程序的輸入和輸出。)編譯器可能會為i使用處理器寄存器,並且永遠不會將其值保存在內存中。 循環執行結束后,處理器可以立即重用該寄存器用於其他目的。

這取決於您定義變量的位置。

如果您在循環之前定義它,並且只是在循環內部對其進行初始化 - 它將在循環之后繼續存在,保留由循環的最后一次迭代修改的值。 像:

int i;//define variable here

for (i = 0; i < 10; i++)
{
    //some code inside the loop
}

printf("Value of i is: %i", i);//print variable here

輸出將是:

Value of i is: 10

在另一種情況下 - 您可以在循環內定義和初始化變量(就像您在示例中所做的那樣)。 在這種情況下,變量將在程序離開循環后立即被刪除,因為它離開了局部范圍。 你可以嘗試將它傳遞給一個函數,在循環之后 - 你會收到編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM