[英]Pointer pointing to an empty array
我有一個指向數組開頭的指針,但我需要檢查它是否未分配。 我想到取消引用指針並檢查是否為NULL,但這會導致類型錯誤。 誰能看到我做錯了什么?
int mydispose(int *array){
int i = 0;
if(*array == NULL){
return 1;
}
return ;
}
編輯:對不起,如果我不清楚:我有一個指向數組開頭的指針,但我想檢查數組是否為空。
*array == NULL
是錯誤的。 您首先取消引用指針(如果指針確實為null,則可能導致段錯誤),然后將其int值與指針值進行比較。 此外,如果將NULL
定義為0
而不是(void *) 0
,則編譯器將完全接受該錯誤表達式。
您應該檢查array == NULL
以查看傳遞的指針是否引用任何內容,然后僅在它不為NULL
情況下取消引用它。
但請注意,取消引用非空指針也不能保證是安全的操作。 如果指針包含垃圾值,因為它是在堆棧上分配而未初始化,或者如果它指的是內存的釋放區域,則會發生令人討厭的錯誤。
你想要if (array == NULL)
- 但除非你首先將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指針(但是你不能解除引用)。 兩種方式都符合標准。
您的代碼的直接問題是您在將array
與NULL進行比較之前解除引用array
。 表達式 *array
的類型是int
,而不是int *
。 不要取消引用運算符,類型將匹配:
if (array == NULL) {...}
請注意,如果使用靜態范圍聲明了未初始化的指針(即,它是在文件范圍內聲明或在其前面使用static
關鍵字),則僅保證包含NULL。 類似地,在指針上調用free
不會將該指針值設置為NULL; 它將包含與以前相同的指針值,但現在它將無效。
你必須像這樣使用它:
if(array == NULL) ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.