2010-06-03 125 views
0

如何寫一個if語句來告訴程序指針是否被賦值?是否指針指定或不在C?

錯誤的榜樣

if (*badpdr[0]==0); 
+2

注:這是可能的,你會在試圖解決這個問題的過程中,發現一個叫做'IsBadPtr'功能。 **不要使用它!** – Brian 2010-06-03 15:04:00

+0

爲什麼不使用isbadptr? – gkaykck 2010-06-03 15:44:42

+1

閱讀http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx – Brian 2010-06-08 11:35:25

回答

6

你的意思是if (badptr==NULL)

請注意,當您定義它或當您「取消分配它」(例如,您刪除它所引用的對象)時,您必須首先將您的指針設置爲NULL。否則,它將包含垃圾,並且此測試將失敗,因爲值不會爲0.

您也可以將比較結果設置爲0而不是NULL,因爲已經有足夠的參數,因此這是正確的形式,所以我贏了不要重複他們。

+0

是不是更多的C + +? – Simon 2010-06-03 14:49:33

+1

儘管公平,但在C中確保badptr爲NULL是您自己的任務。所以將它初始化爲NULL(如果你不把它初始化爲其他東西)並且跟隨一個ptr = NULL的delete語句。 但是,無論如何,這是你應該做的事情,所以這裏沒有真正的缺點。 – Jasper 2010-06-03 14:50:49

+0

@Simon:我實際上並不確定,自從我編寫/教授ANSI-C已經很多年了,我的思想被C++蒙上了陰影(儘管承認,自從我編寫任何C++之後已經有很多年了:) – Uri 2010-06-03 14:51:13

3
char *ptr=NULL; 

initalize the pointer to NULL;那麼稍後您可以檢查它是否爲NULL,以確定它是否有效,然後再嘗試遵守它。

0

您可以安裝信號處理程序SIGSEGV,然後嘗試取消引用指針 - 如果你發現自己訊號處理器中,指針不分配(或指向無效的內存地址,這基本上是同樣的事情)

但是,可能存在未分配的指針指向屬於進程內存空間的有效地址的情況 - 在這種情況下,將不會引發SIGSEGV

+0

一個downvoter會如此善意解釋downvote?無論出於何種原因,您可能都不喜歡這個答案,但這並沒有錯。 – qrdl 2010-06-07 17:42:16

+0

如果您使用信號處理程序並嘗試解引用指針並將指針指向可用內存外的區域,則會拋出一個僅允許拋出一次的奇怪異常。然後,當您稍後嘗試分配內存時,分配器將查找該異常以查看是否需要增加地址空間並且不會看到它,並且事情不會正常工作。請注意,以前的所有文本都略有偏差,因爲我從一篇文章中相當朦朧的回憶中寫下了這篇文章,這篇文章解釋了爲什麼嘗試通過取消引用驗證內存是一個壞主意。 – Brian 2010-06-07 22:08:30

+0

@Brian你在說什麼異常?問題是關於C而不是C++,C沒有任何例外。我寫了關於信號的信號,不是例外,信號是一個非常不同的東西。我認爲你混淆了兩個完全不同的概念。 – qrdl 2010-06-08 06:59:54

1

C++int變量未被賦值時,它們的初始值爲2686392!

0

您可以使用宏,它不會工作:

#define NP_CHECK(ptr) \ 
    { \ 
     if (ptr == NULL) { \ 
      fprintf(stderr, "%s:%d NULL POINTER: %s\n", \ 
       __FILE__, __LINE__, #ptr); \ 
      exit(-1); \ 
     } \ 
    } \