2017-02-09 57 views
-2

我用 「了funcName 4」非常奇怪的數組聲明的問題 - ç

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[numPassedIn]; 

print語句打印 「4」 調用這個函數。說得通。

但是,數組kidPID沒有正確初始化(聲明?)。沒有空間來存儲pid_t。

如果我改變代碼來讀取

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[4]; 

它確實提供了空間。這裏發生了什麼?提前致謝!

+1

爲什麼你認爲'kidPID'未正確分配呢?使用靜態或動態大小,數組將具有相同的屬性。第一個版本的問題與第二個版本沒有什麼關係? (除非你傳遞參數除外!!) –

+0

變長數組是一個可選的實現,所以你的編譯器可能不支持。 –

+0

你怎麼知道它沒有正確分配? – immibis

回答

2

C允許在運行時確定數組中元素的數量時聲明可變長度數組(VLA)。

因此,在此聲明

pid_t kidPID[numPassedIn]; 

存在被聲明用等於存儲在變量numPassedIn值元素的數量的可變長度的數組。如果變量numPassedIn的值等於4,則該聲明實際上是(有一些限制)等同於聲明

pid_t kidPID[4]; 
+0

現在僅支持向後兼容的可變長度數組。 –

+0

@WeatherVane是否發佈了新的C標準草案? –

+0

AFAIK即C11。可選的。在C99中,他們是有史以來最好的事情。顯然沒有更多。 –