2015-02-23 85 views
2

(我將改寫標題,如果任何人有什麼建議,我知道這是有點尷尬。)不使用malloc()聲明的C數組是否需要檢查其有效性?

當使用malloc()分配在C動態數組的內存,我知道要檢查,如果調用成功通過驗證指針不是NULL。是否需要對C中顯式聲明的數組執行相同的檢查,例如以下示例(取自this question)?

char arrinit[5]; 
char (*arrinit_two)[5] = &arrinit; 
+0

您確定您是指發佈的代碼嗎? – 2015-02-23 02:39:45

+0

@iharob該代碼有問題嗎? – vaindil 2015-02-23 02:40:14

+0

是的,它是無效的,請參閱我的答案。 – 2015-02-23 02:41:08

回答

5

總之:不!

編譯器將確保您的數組將具有足夠的內存,您可以靜態定義。

通常(取決於您如何聲明它們),它們將被分配到堆棧中,並且當堆棧上沒有足夠的內存時,程序可能會崩潰,然後才能進行任何檢查,否則無法做任何補救措施。

順便說一句:你也不會得到一個NULL值,因爲系統會給你一些地址值,即使沒有剩餘內存(或之前已經崩潰)。

當然有一種情況,你應該小心:當你想分配真正大量的內存(一個大數組)時,你應該用malloc來做。在許多系統上,堆棧的大小對進程是有限的,所以當你在堆棧上分配大量內存(編譯器爲你做)時,你的系統崩潰的可能性大大高於你用malloc做的時候(因爲那裏不是相同的限制)。

但是,當然在今天的計算機上,這意味着您可以在它有任何影響之前擁有至少一些MB的數組。對於數組< 1MB,您不需要打擾。

+0

完美。謝謝! – vaindil 2015-02-23 02:42:50

+0

歡迎您! – Juergen 2015-02-23 02:44:23

+0

**系統棧**沒有這樣的東西。 – 2015-02-23 02:45:04

2

沒有,如果指針指向一個堆棧變量不需要檢查,我猜你的意思是

int array[5] = {1, 2, 3, 4, 5}; 
int *pointer; 

pointer = array; 
if (pointer != NULL) /* will always be true */ 
... 

有一些會發出警告

if (array != NULL) 

,並告訴你的編譯器警告這種情況總是如此。

在你聲明的指針和指向它的情況下,像

int *pointer = array; 

則因爲數組分配的編譯器將不能向您發出警告,但仍是條件不能爲假時功能堆棧框架被創建,所以如果不能分配數組,那麼將不可能調用該函數。

3

如果定義一個數組對象,檢查它是否成功分配是不必要或不可能的。

如果它與靜態存儲持續時間定義(即,無論是任何函數體之外定義或與所述static關鍵字定義),然後在編譯時被確定必要的,加載程序時分配的內存量。如果沒有足夠的空間,取決於系統,您的程序很可能會執行失敗。

如果它在沒有static關鍵字的函數中定義,則在調用該函數時或在包含該函數的塊的入口處分配內存。如果分配失敗,則行爲未定義。最常見的情況是,程序會因「堆棧溢出」或類似的情況而死亡。該語言不能提供一種方法來事先檢測這種分配是否成功,或者在事實失敗後檢測。

這意味着這樣的事情:

{ 
    char arr[5]; 
    if (arr != NULL) ... 
} 

幾乎肯定從來沒有檢測到任何分配失敗;聲明對象的地址始終爲非空。

相關問題