如果在循環中聲明瞭一個變量,以前的聲明是否變成垃圾?例如,在以下內容中:C中的可用內存連續聲明
loop{
int array[10];
array[i]=......
}
array
針對每個循環迭代進行聲明。當新聲明時,數組是否與舊位置分配相同的新內存位置?如果不是,舊的聲明是否變成垃圾,因爲分配的區域沒有被釋放?最後,如果數組像上面的例子那樣是靜態的,它怎麼能在不退出循環的情況下被釋放?
如果在循環中聲明瞭一個變量,以前的聲明是否變成垃圾?例如,在以下內容中:C中的可用內存連續聲明
loop{
int array[10];
array[i]=......
}
array
針對每個循環迭代進行聲明。當新聲明時,數組是否與舊位置分配相同的新內存位置?如果不是,舊的聲明是否變成垃圾,因爲分配的區域沒有被釋放?最後,如果數組像上面的例子那樣是靜態的,它怎麼能在不退出循環的情況下被釋放?
這是編譯器自動處理的自動變量。
你只需要照顧你使用new
或malloc
自己分配的存儲空間。剩下的就是爲你處理的。
每次進入循環時,array
都會進入範圍,並在每次循環結束時再次銷燬。編譯器很可能每次重用相同的空間,但這不是由語言定義的。任何一種方式都不會有垃圾。
這是更具解釋性的感謝。 – barp 2012-04-19 09:07:37
你實際上並沒有分配任何東西。這將在堆棧中進行,堆棧框架的大小由編譯器在編譯時計算。該數組將在每次迭代中重複使用相同的堆棧空間。 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
任何東西。編譯器會爲你處理這個問題。
您可以假設,對於循環的每次迭代,都會創建一個新數組,並在迭代結束時將其銷燬。這意味着新創建的數組的內容是未定義的(可能是垃圾 - 由於它可能佔據堆棧中的相同位置,所以它包含相同數據的機會更大)
但是,它們在內部不會是int array[10]
的任何分配或釋放指向Dervall
它意味着新創建的數組的內容是未定義的(可能是垃圾 - 它可能包含相同數據的可能性更大,因爲它可能佔用堆棧中的相同位置)。這是我想知道的確切點。 – barp 2012-04-19 09:16:07
如果你在循環之外聲明'array',這一切都很好。變量「變成垃圾」超出了它們聲明的範圍,但它們的值不是。所以複製到數組中的是什麼。 – enobayram 2012-04-19 08:56:42