簡體   English   中英

指向空數組的指針

[英]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分配狀態的唯一安全方法是:

  1. 確保未分配*array設置為NULL。 int *array = NULL;
  2. 檢查數組是否為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM