簡體   English   中英

C,函數完成后的變量會發生什么?

[英]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.

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