簡體   English   中英

C:內存中的循環,條件,結構

[英]C: Loops, conditions, structs in memory

這個問題聽起來很瑣碎,但是,我知道每當一個函數開始執行時,都會在堆棧中為該函數的所有局部變量創建一個堆棧框架,但是我無法理解,當for循環開始執行時,或者內部的代碼發生了什么如果條件開始執行。 將它們視為在函數的堆棧框架內執行似乎是不合理的,因為它們具有自己的作用域,因此也具有自己的局部變量。 但是,它們可以訪問它們上面的函數的變量,因此這似乎暗示它們在函數的堆棧框架內。

那么有人可以幫我解決這個問題嗎?

它們在執行時實際位於內存中的什么位置?

對於結構,也會出現同樣的問題,它們具有自己的作用域,它們不是指針,而只是包含整數,char * s等的更大的“盒子”。

循環(或任何其他類似塊的構造,例如if-else語句)與函數相似。 功能是一個自治實體。 它本身就是完整的計算過程。 調用函數時,除全局變量外,函數的指令,語句和表達式只能訪問函數的局部變量和參數(竅門是可以將參數綁定到調用函數的局部變量,其地址等)。 。

但是,循環,if-else或任何其他類型的塊是函數的一部分 不是單獨的計算單位。 他們不是“被稱為”。 只需達到並執行它們即可。

塊具有作用域的事實並不意味着它們需要單獨的堆棧框架。 輸入新的作用域時,不會創建堆棧框架。 調用函數時會創建一個堆棧框架,因為該堆棧與控制流管理有關(例如,框架也需要保存該函數的返回地址。)

是的,嵌套作用域中變量的分配和銷毀可以由堆棧表示,但不是調用堆棧。 那是某種“范圍堆棧”,純粹是概念上的。 讓我用一個例子來說明這一點:

void foo()
{
    int a = 42;       // 'a' is declared and is in scope.
                      // Let's pretend its address is 0x1000.

    {
        int b = 1337; // 'b' is declared and in scope.
                      // Let's pretend its address is 0x1004.
    }

    // here, 'b' is destroyed. Nothing is "popped" out of the stack
    // at runtime – it's merely that the compiler can detect that the
    // name 'b' is not in scope anymore. And hence:

    int c = 0; // it may now reuse the former address of 'b', 0x1004,
               // for storing 'c'.
               // Each of these 3 variables reside within the same stack frame.
}

至於結構:再次完全不同。 如果聲明結構類型的變量,則將分配足夠大的內存以按順序容納結構的所有成員。 在內存方面,“沒有結構”。 只有結構的成員 ,它們被一一分配,並正確對齊。 struct只是一個抽象。

實際上,該變量存在於函數的主堆棧框架中。 您只是不能在聲明它的子塊之外的任何地方引用它。 並不是每次循環都會不斷創建和銷毀變量。 因此,更多的問題是編譯器允許您通過其名稱而不是其實際存在來引用它。

暫無
暫無

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

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