2012-09-06 30 views
4

所以我正在研究內存分配,它說你只能使用malloc()動態分配內存;但是這不是動態內存分配嗎?它工作btw.So我有點困惑。這個數組是靜態的還是動態的?

#include<stdio.h> 
#include<conio.h> 
int main() 
{ 
    int integer,cntr; 
    scanf("%d",&integer); 
    char words[integer]; 
    for(cntr = 0;cntr < integer - 1;cntr++) 
     words[cntr] = 'k'; 
    words[cntr] = '\0'; 
    printf("%s",words); 
    getch(); 
    return(0); 
} 

回答

4

這是一個variable-length array。大小確實是動態的,但在實踐中它通常會被分配到堆棧而不是堆(所以不要使用它來設置太大的值)。

根據你的編譯器等等,這可能最終比分配堆內存快得多,只不過是堆棧指針的調整。

變長數組是在C99標準中引入的,因此請記住,您將無法將它們用於很老的C編譯器(如MSVC)。

+0

等待我困惑,所以它的動態?但@ jack/*下面的註釋* /因爲它被分配在堆棧而不是堆中,它仍然被認爲是靜態的。我認爲動態的定義是如果內存將在運行時分配 – latenightcode

+0

嗯,我的意思是大小是動態的,並在運行時確定。當你的線程被創建時,堆棧仍然是一個靜態的內存塊,分配給一個有限的大小。 –

+0

那麼即使大小是動態的,並且在運行時確定,只要將其分配在堆棧中而不是堆中,它仍然是靜態的呢?以防萬一它出現在測試中 – latenightcode

0

因爲陣列的堆棧上被分配,而不是在這是靜態的。

它不是由內存管理器分配的,它只是保留在堆棧上,但沒有其他。只要它超出範圍,它就不復存在(在使用它的時候會提供垃圾)。

請注意,由於堆棧有限,因此您無法以這種方式分配這麼大的數組。

+0

如果它在堆棧上,它不是靜態的。靜態分配意味着地址在程序期間是固定的。你可以想象做靜態分配的激活記錄 - 在沒有明顯遞歸的情況下 - 甚至是在早期的FORTRAN編譯器中完成的,但我不認爲有人曾經爲C或C++做過這樣的事情。 – AProgrammer

+0

這有點不當使用靜態的堆棧分配對象,我同意你的看法。但是它並不是動態的,因爲它不是由任何內存分配器管理的,它只是保留了堆棧。它被認爲是_automatic_,正如詹姆斯的答案中所解釋的那樣。 – Jack

1

該數組是本地陣列,它將自動釋放一旦其被限定的端部的範圍({})。
從技術上講,標準沒有定義它應該分配的位置,而只是定義了數組必須提供的特性。該標準甚至不提及堆棧或堆。:

相關問題