2012-04-04 66 views
0

我是一個noob,所以我會做這個簡短。以下是合法的(C99)?我不想一次存儲超過一個數組。我可以創建一個最大需要長度的數組,並且只使用它的一部分,但我寧願這樣做。聲明數組兩次(C99)

int main(){ 
    double drm[15000]; 
    //do some stuff 
    double drm[14000]; 
    //do some other stuff 
} 

回答

1

不,你不能那樣做。他們需要在不同的區塊。你可以這樣做:

int main(void) 
{ 
    { 
    double drm[15000]; 
    // do some stuff 
    } 
    { 
    double drm[14000]; 
    // do some other stuff 
    } 
} 

但是,爲什麼不只是調用一個函數呢?即使你把它們放在不同的塊中,你實際上也不能確定編譯器在存儲方面做什麼。

+0

謝謝!我沒有把它放在我最小的例子中,但它實際上在for(blah = 0; blah user1313527 2012-04-04 19:26:00

+0

是的 - 一個新的塊在任何有'{'的地方開始,並在匹配的'}出現的地方結束。 – 2012-04-04 20:43:44

0

由於數組與C中的指針強相關,因此您也可以使用動態數組。首先,分配一個新的具有15000個元素的雙數組。當你不再需要它時,刪除它。然後創建一個包含14 000個元素的新數組。

不要忘記在使用陣列後釋放你的堆。人們往往會忘記這一點。此外,你應該檢查分配是否成功。

int main(void) 
{ 
    double *drm = 0; 
    drm = (double*)malloc(15000 * sizeof(double)); 
    // do something 
    free(drm); 
    drm = (double*)malloc(14000 * sizeof(double)); 
    // do some other stuff 
    free(drm); // don't forget me 
} 

但是,我會同意卡爾諾魯姆:使用函數來代替。

+0

文章被標記爲「C99」,而不是「C++」。請更新您的示例以使用'malloc()'和'free()'。 – tomlogic 2012-04-04 18:28:39

+0

何時將'new'添加到C99? – KevinDTimm 2012-04-04 18:29:07

+0

哦,對不起,我可能混合了這兩種語言。我稍後會解決這個問題。 – 2012-04-04 18:30:43

0

你可以使用mallocfree(或realloc如果你不介意保持數據):

#include <stdlib.h> 
int main(void) 
{ 
     double *drm = (double *)malloc(sizeof(double)*15000); 
     //do stuff 
     free(drm); 
     drm = (double *)malloc(sizeof(double)*14000); 
     //do other stuff 
     free(drm); 
} 
+1

不要施放malloc()的結果 – KevinDTimm 2012-04-04 18:53:36

+0

@KevinDTimm爲什麼不呢?它沒有什麼問題。 – 2012-04-04 18:56:14

+1

@JacobAbrahams:沒有什麼正確的。類型'void *'的表達式可以隱式轉換爲任何指針類型(除了指向函數的類型)。演員陣容很混亂,根據具體情況可以掩蓋錯誤。例如,在C90中,如果您忘記'#include '(* not *'';這是非標準的),編譯器將假定'malloc'返回'int';將結果轉換爲'double *'可能會導致生成不正確的代碼。 – 2012-04-04 19:06:49