回覆列表
  • 1 # 使用者656089248049

    基本上C程式的元素儲存在記憶體的時候有3種分配策略:

    靜態分配

    如果一個變數宣告為全域性變數或者是函式的靜態變數,這個變數的儲存將使用靜態分配方式。靜態分配的記憶體一般會被編譯器放在資料段或程式碼段來儲存,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平臺及gcc編譯器為例,全域性及靜態變數放在資料段的低端;全域性及靜態常量放在程式碼段的高階

    自動分配

    函式的自動區域性變數應該隨著函式的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,執行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數執行時改變大小。

    所以說C函式永遠不應該返回一個區域性變數的地址。

    要指出的是,自動分配也屬於動態分配,甚至可以用alloca函式來像分配堆(Heap)一樣進行分配,而且釋放是自動的。

    動態分配

    還有一種更加特殊的情況,變數的大小在執行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函式是malloc、calloc、realloc和free。

    使用堆(Heap)記憶體將帶來額外的開銷和風險。

  • 中秋節和大豐收的關聯?
  • 請問荔波芋頭怎麼做?