我有一個指向數組開頭的指針,但我需要檢查它是否未分配。我想過取消引用指針並檢查NULL是否會導致類型錯誤。任何人都可以看到我做錯了什麼?指向空數組的指針
int mydispose(int *array){
int i = 0;
if(*array == NULL){
return 1;
}
return ;
}
編輯:對不起,如果我不清楚:我有一個指向數組的開始的指針,但我想檢查數組是否爲空。
我有一個指向數組開頭的指針,但我需要檢查它是否未分配。我想過取消引用指針並檢查NULL是否會導致類型錯誤。任何人都可以看到我做錯了什麼?指向空數組的指針
int mydispose(int *array){
int i = 0;
if(*array == NULL){
return 1;
}
return ;
}
編輯:對不起,如果我不清楚:我有一個指向數組的開始的指針,但我想檢查數組是否爲空。
*array == NULL
是錯誤的。您先解引用指針(如果指針真的爲空,可能會導致段錯誤),然後將其int值與指針值進行比較。此外,如果NULL
定義爲0
而不是(void *) 0
,那麼您的編譯器將完全接受該錯誤表達式。
您應該檢查array == NULL
以查看傳遞的指針是否指向任何內容,然後僅在它不是NULL
的情況下對其進行解引用。
但是,請注意,取消引用非空指針並不保證是安全的操作。如果指針包含一個垃圾值,因爲它被分配在堆棧上並未初始化,或者如果指向一個釋放的內存區域,則可能會發生令人討厭的錯誤。
謝謝,這是我最初的想法,但是這不只是告訴我,我有一個空指針,而不是一個指向空數組的指針? – Alex 2010-11-08 17:28:27
在C中沒有這樣的空數組 - 當將數組傳遞給函數時,您應該始終傳遞一個指示長度的數字。如果該數字爲零,則可以將該數組視爲空。然而,有一個空字符串的概念,因爲通過約定字符串在最後以零字符分隔。如果第一個字符是零字符,則認爲該字符串是空字符串。 – 2010-11-08 17:49:25
好的,謝謝BB,所以也許我應該測試一個零字符?我正在重寫malloc(),「如果數組具有正確初始化結構的形式,並且當前分配的塊沒有 ,則此函數將返回1,否則它將返回0.」 – Alex 2010-11-08 20:45:07
你想要if (array == NULL)
- 但除非你第一次初始化array
到NULL
,它也不會有任何好處。我認爲你最好備份並告訴我們更多關於你想要完成的事情,並試圖幫助你實現你的總體目標。
這個。 *「......我知道我需要做Foo,但不明白如何......」*通常表明你不需要做Foo,但完全是另一回事。 – dmckee 2010-11-08 16:36:40
@dmckee:是的,確切地說。當/ Foo是幾乎沒人需要做的事情時,這特別可能。 – 2010-11-08 16:48:44
您必須使用這樣的:
if(array == NULL) ...
比較安全的方法來確定的*array
分配情況是:
*array
設置爲NULL不分配。 int *array = NULL;
if (array == NULL) return -1;
你不能可靠地檢查,如果一些存儲位置進行分配。 *array
不是有效的代碼,因爲它與array[0]
相同,但array[0]
未分配。未分配的內存位置可以包含任何值的值。
唯一的選擇是確保您獲得有關陣列是否與陣列一起分配的信息。一個受歡迎的選項是將未分配的數組表示爲NULL
,但您也可以選擇其他選項。
順便說一句,空數組(即大小爲0的數組)和數組根本沒有分配。當你使用malloc(0)
時,第一個選項會發生,第二個選項是當你的指針沒有初始化時。對於malloc(0)
,它允許返回NULL
,但它允許返回一個非NULL指針(但不能取消引用)。根據標準,兩種方法都是有效的。
您的代碼的直接問題是您在將它與NULL進行比較之前取消引用array
。 表達式的類型*array
是int
,而不是int *
。離開關引用操作和類型將匹配:
if (array == NULL) {...}
注意,未初始化的指針只保證包含NULL,如果它是靜態的程度聲明(即,它是在文件範圍內或與static
關鍵字任一聲明的在它的前面)。同樣,在指針上調用free
不會將該指針值設置爲NULL;它將包含與以前相同的指針值,但現在它將無效。
-1?這個問題表明缺乏瞭解,但這是提問的關鍵。代碼格式化,問題很明顯。如果你打算讓某人失望,至少說出原因。 – nmichaels 2010-11-08 16:18:16