2012-04-19 31 views
1

如果在循環中聲明瞭一個變量,以前的聲明是否變成垃圾?例如,在以下內容中:C中的可用內存連續聲明

loop{ 

    int array[10]; 

    array[i]=...... 

} 

array針對每個循環迭代進行聲明。當新聲明時,數組是否與舊位置分配相同的新內存位置?如果不是,舊的聲明是否變成垃圾,因爲分配的區域沒有被釋放?最後,如果數組像上面的例子那樣是靜態的,它怎麼能在不退出循環的情況下被釋放?

+0

如果你在循環之外聲明'array',這一切都很好。變量「變成垃圾」超出了它們聲明的範圍,但它們的值不是。所以複製到數組中的是什麼。 – enobayram 2012-04-19 08:56:42

回答

3

這是編譯器自動處理的自動變量。

你只需要照顧你使用newmalloc自己分配的存儲空間。剩下的就是爲你處理的。

每次進入循環時,array都會進入範圍,並在每次循環結束時再次銷燬。編譯器很可能每次重用相同的空間,但這不是由語言定義的。任何一種方式都不會有垃圾。

+0

這是更具解釋性的感謝。 – barp 2012-04-19 09:07:37

7

你實際上並沒有分配任何東西。這將在堆棧中進行,堆棧框架的大小由編譯器在編譯時計算。該數組將在每次迭代中重複使用相同的堆棧空間。 int array[10]在運行時沒有任何效果。

有做這個有很大的區別:

for (...) { 
    int a[10]; 
    a[0] = x; 
} 

,做這樣的:

for (...) { 
    int* a = (int*)malloc(sizeof(int)*10); 
    a[0] = x; 
    free(a); 
} 

第一個「分配」的大小是固定,並會花你一分錢。第二個可以是可變大小的,並且將是一個堆分配數組,您將需要手動釋放。 C沒有垃圾回收的概念,所以沒有任何東西真的變成垃圾。但是您需要使用malloc函數釋放您分配的任何內容。如果你從不使用這個功能,你永遠不需要free任何東西。編譯器會爲你處理這個問題。

+0

即使我全心同意你的回答,但我不確定你的術語對於有人提出這樣一個基本問題是否意味着什麼。 – enobayram 2012-04-19 09:00:08

+0

你可能是對的。我會詳細闡述一下。 – Dervall 2012-04-19 09:01:30

0

您可以假設,對於循環的每次迭代,都會創建一個新數組,並在迭代結束時將其銷燬。這意味着新創建的數組的內容是未定義的(可能是垃圾 - 由於它可能佔據堆棧中的相同位置,所以它包含相同數據的機會更大)

但是,它們在內部不會是int array[10]的任何分配或釋放指向Dervall

+0

它意味着新創建的數組的內容是未定義的(可能是垃圾 - 它可能包含相同數據的可能性更大,因爲它可能佔用堆棧中的相同位置)。這是我想知道的確切點。 – barp 2012-04-19 09:16:07