[英]C, what happens with the variables of a function when it finish?
假設以下代碼:
void foo()
{
int i = 5;
printf("%d", i);
}
int main()
{
foo();
return 0;
}
當我調用foo時,聲明“i”並設置為5,當此函數完成時,“i”變量被釋放?
我可以在while(1)循環中調用foo()而沒有內存泄漏風險嗎?
謝謝!
在C語言中,變量具有范圍,即代碼所屬的區域,例如循環或函數。 在這種情況下,變量的范圍就是函數。
達到變量范圍的末尾時,將取消分配您的變量。 這意味着您的變量使用的內存已釋放。 因此,在函數結束時,將釋放您分配的唯一內存空間(用於存儲整數的內存空間)。
要繼續標題中的一般性問題,您還可以分配將保留在聲明范圍之外的內存。
void foo()
{
int i = 5;
int* j = (int*) malloc(sizeof(int));
*j = i*2
printf("%d", i);
}
例如,在上面的代碼中,i和j變量都將在函數末尾被釋放。
但是,j是一個指針,它是包含將被釋放的指針的內存空間,而不是包含j指向的實際值的內存空間(即使沒有為* j分配值也是如此)。
為了避免此處發生內存泄漏,您必須在退出函數之前調用free(j)
。
如果函數返回一個int*
而不是void
類型,你也可以return j
而不是釋放它,所以你仍然可以訪問j所指向的內存區域,你調用了這個函數。 這樣做,您將能夠使用該值,並稍后通過調用free(j);
釋放所使用的內存空間free(j);
。
int i = 5;
在堆棧上聲明int類型的變量。 堆棧上聲明的變量在超出范圍時釋放內存。 功能完成后, i
超出了范圍。
所以,是的,你可以反復調用該函數,沒有內存泄漏。
您不在乎,您應該相信i
消失了。 在我所知道的所有實現中,本地i
要么在一個寄存器中,它會被重用於其他目的,或者是在一個被彈出的堆棧幀中。 參見例如電話堆棧上的wikipage,它給出了一個很好的圖片。
AFAIU,C99標准規范中沒有任何內容完全需要堆棧,但我知道沒有任何實現不使用任何堆棧。
所以當然,你可以在main
中循環調用foo
。
我建議使用所有警告和調試信息(例如gcc -Wall -g
)編譯代碼,並使用調試器(例如gdb
)逐步運行程序並顯示i
的地址
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.