(我將改寫標題,如果任何人有什麼建議,我知道這是有點尷尬。)不使用malloc()聲明的C數組是否需要檢查其有效性?
當使用malloc()
分配在C動態數組的內存,我知道要檢查,如果調用成功通過驗證指針不是NULL。是否需要對C中顯式聲明的數組執行相同的檢查,例如以下示例(取自this question)?
char arrinit[5];
char (*arrinit_two)[5] = &arrinit;
(我將改寫標題,如果任何人有什麼建議,我知道這是有點尷尬。)不使用malloc()聲明的C數組是否需要檢查其有效性?
當使用malloc()
分配在C動態數組的內存,我知道要檢查,如果調用成功通過驗證指針不是NULL。是否需要對C中顯式聲明的數組執行相同的檢查,例如以下示例(取自this question)?
char arrinit[5];
char (*arrinit_two)[5] = &arrinit;
總之:不!
編譯器將確保您的數組將具有足夠的內存,您可以靜態定義。
通常(取決於您如何聲明它們),它們將被分配到堆棧中,並且當堆棧上沒有足夠的內存時,程序可能會崩潰,然後才能進行任何檢查,否則無法做任何補救措施。
順便說一句:你也不會得到一個NULL值,因爲系統會給你一些地址值,即使沒有剩餘內存(或之前已經崩潰)。
當然有一種情況,你應該小心:當你想分配真正大量的內存(一個大數組)時,你應該用malloc來做。在許多系統上,堆棧的大小對進程是有限的,所以當你在堆棧上分配大量內存(編譯器爲你做)時,你的系統崩潰的可能性大大高於你用malloc做的時候(因爲那裏不是相同的限制)。
但是,當然在今天的計算機上,這意味着您可以在它有任何影響之前擁有至少一些MB的數組。對於數組< 1MB,您不需要打擾。
沒有,如果指針指向一個堆棧變量不需要檢查,我猜你的意思是
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;
則因爲數組分配的編譯器將不能向您發出警告,但仍是條件不能爲假時功能堆棧框架被創建,所以如果不能分配數組,那麼將不可能調用該函數。
如果定義一個數組對象,檢查它是否成功分配是不必要或不可能的。
如果它與靜態存儲持續時間定義(即,無論是任何函數體之外定義或與所述static
關鍵字定義),然後在編譯時被確定必要的,加載程序時分配的內存量。如果沒有足夠的空間,取決於系統,您的程序很可能會執行失敗。
如果它在沒有static
關鍵字的函數中定義,則在調用該函數時或在包含該函數的塊的入口處分配內存。如果分配失敗,則行爲未定義。最常見的情況是,程序會因「堆棧溢出」或類似的情況而死亡。該語言不能提供一種方法來事先檢測這種分配是否成功,或者在事實失敗後檢測。
這意味着這樣的事情:
{
char arr[5];
if (arr != NULL) ...
}
幾乎肯定從來沒有檢測到任何分配失敗;聲明對象的地址始終爲非空。
您確定您是指發佈的代碼嗎? – 2015-02-23 02:39:45
@iharob該代碼有問題嗎? – vaindil 2015-02-23 02:40:14
是的,它是無效的,請參閱我的答案。 – 2015-02-23 02:41:08