2014-12-31 88 views
0

我一直都知道,如果不使用mallocfree就不可能在C中構建動態數組,那爲什麼這段代碼編譯和運行正確?C中的靜態數組

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    int a; 
    printf("Insert a number: "); 
    scanf("%d", &a); 

    int array[a]; 
    int i; 
    for(i=0; i<a; i++) 
    { 
     array[i] = rand(); 
    } 

    for(i=0; i<a; i++) 
    { 
     printf("%d\t", array[i]); 
    } 
    puts(""); 
    return 0; 
} 

我明白,既然沒有辦法改變的「數組」的大小已經宣佈後,這是不是一個真正的動態數組,也可以釋放callling free()但我仍然一直以爲在編譯時必須知道靜態數組的大小,這在這裏顯然不是這樣的。

+7

它被稱爲VLA(可變長度陣列)。它是在C99中引入的 –

+0

是什麼讓你認爲它是一個靜態數組?我無法在任何地方看到「靜態」關鍵字。正如Cool Guy所解釋的那樣,「你一直都知道的事情」並不總是真實的事情。 – gnasher729

+0

據我所知,「靜態數組」意味着在執行main()之前分配的數組,這就是您在代碼中使用的每個固定大小數組的情況。 – woggio

回答

1

你正在使用的是variable length array。這是由C99和後者支持的。但請注意,VLA具有自動存儲持續時間,不同於由malloc家族功能分配的動態存儲器。

另請注意,編譯時間分配不等於static數組。數組和靜態分配是不同的。

+1

*但請注意,它的範圍僅限於聲明的函數,與動態分配不同。*您正在混合詞法範圍和存儲持續時間。 – ouah