2010-04-06 75 views

回答

1

Wiki

這是一個指向未初始化的對象或有狀態不好的對象。使用這個指針會造成麻煩。維基是一個很好的解釋來源。

+0

如果一個對象違反了它的不變量,它也可以被認爲處於不良狀態,但是指向它的指針不是一個通配符。所以這個定義有點不對。 – sbi 2010-04-06 09:10:16

+0

這取決於壞狀態的性質。但是我明白你的觀點,我已經提到了wiki頁面的確切定義。 – Dani 2010-04-06 09:16:55

+0

請注意,該語言要求通過類型爲unsigned char的左值進行訪問始終可以用於讀取或寫入對象,即使它在解釋爲其聲明類型時處於不良狀態。 – janks 2010-04-06 12:16:52

5

這不是標準術語。它通常用於指向指向無效內存位置的指針。 int *p; *p = 0; //P is a wild pointer

或者

int *p = NULL; 
{ 
    int a; 
    p = &a; // as soon as 'a' goes out of scope,'p' is pointing to invalid location 
} 

*p = 0; 
+3

當指針指向的位置超出作用域(或被釋放)時,它將成爲懸掛指針,而不是通配符。野指針是一個沒有初始化的指針。 – Technowise 2010-04-06 10:06:28

+1

@Technowise:我不同意。我聽說這兩個術語可以互換使用。 – sbi 2010-04-06 12:02:21

10

野生指針在C是尚未之前其首次使用初始化的指針。 從Wikipedia

野生指針通過省略 必要的初始化之前 第一次使用創建的。因此,嚴格來說, 編程語言 中的每一個不強制執行初始化的指針 都以野指針開始。

這最常發生是因爲在初始化時跳過 ,而不是由 省略它。大多數編譯器能夠 警告這一點。

int f(int i) 
{ 
    char* dp; //dp is a wild pointer 
    ... 
} 
+2

該術語也用於_had_已初始化的指針,但現在已變成wildiesis的指針。見Naveen的答案:http://stackoverflow.com/questions/2583656/2583678#2583678 – sbi 2010-04-06 09:08:30

+1

@Magnus - 感謝編輯! @sbi - 我通常聽到你所描述的狀態被稱爲「搖晃的指針」的狀態指針,但是你是正確的,它們有效地處於與「野指針」相同的狀態。 – 2010-04-06 15:26:31

+0

不完全相同 - 在許多帶有動態內存的系統中,懸掛指針指向的數據在重用之前似乎是有效的,而通常會指向垃圾。 – 2010-06-23 09:08:40

3

爲了獲得外(又名晃來晃去)指針您:

  • 創建一個對象
  • 創建一個指向對象
  • 刪除對象
  • 忘記將指針設置爲空

指針現在歸類爲「狂野」,因爲它指向任意一塊內存,並且在此狀態下使用它可能會導致程序出現問題。

+1

我認爲你必須稱它們爲**搖晃的指針**,* wild *指的是單數化的指針 – Eineki 2010-04-06 09:09:16

+1

+1,用於提及「懸掛指針」這個術語。正如Eineiki所說,我懷疑這個搖晃的指針不是一個狂野的指針。 – 2010-04-06 09:13:46

+0

'void * p;'也創建一個「野指針」。 – sbi 2010-04-06 09:18:37

2

未用任何地址初始化的指針被稱爲野指針。它可以包含任何垃圾地址,所以解引用野指針是很危險的

-1

它沒有定位任何數據類型varable即varable是叫野指針

47

標準沒有定義或使用術語一個ponter「野」。我會小心地「糾正」其他人對它意味着什麼的意見,我特別要避免引用隨機的非規範互聯網垃圾來支持我的立場。

對我來說,這意味着一個既不指向合法對象也不指NULL的指針。這些類型的指針值的可能來源可能包括未初始化的指針對象,已經不存在的對象,計算的指針值,不正確的對齊指針值,指針本身的意外損壞或指向的內容等。

int main(void) 
{ 

    int *p; // uninitialized and non-static; value undefined 
    { 
     int i1; 
     p = &i1; // valid 
    }   // i1 no longer exists; p now invalid  

    p = (int*)0xABCDEF01; // very likely not the address of a real object 

    { 
     int i2; 
     p = (int*)(((char*)&i2) + 1); // p very likely to not be aligned for int access 
    } 

    { 
     char *oops = (char*)&p; 
     oops[0] = 'f'; oops[1] = 35; // p was clobbered 
    } 
} 

等,等等。在C中有各種各樣的方法來獲取一個無效的指針值。我最喜歡的是那些試圖通過將他們的地址寫入文件來「保存」他的對象的人。奇怪的是,當他在程序的另一個運行過程中讀回這些指針值時,他們沒有再指向他的對象。花哨,那個。

但這正是野生對我意味着什麼。由於這不是一個規範術語,它意味着無論發言或寫作它的人意味着什麼。問他或她。

+11

+1表示該術語不精確,給出4個可能的原因。 – 2010-04-06 12:01:48

2

野指針是指使用的任何指針(特別是作爲L_value {即(*指針)= x}),但其值不正確或不再正確。它也可以用來描述沒有將指針定義爲指針的存儲器的使用(可能通過遵循野指針或使用過時的結構定義)。

沒有官方的定義。這只是我們在提及某些指針錯誤或錯誤結果時使用的單詞。

1

野指針是一個不指向有效對象(指定類型,如果適用)的指針,或指向可區分的空值(如果適用)。

瞭解更多關於Wild Pointer這裏

-1

未初始化的指針稱爲野指針。 假設如果你嘗試

int * p; //指向任何隨機或未知的位置。 * p = 16;/一些未知的內存位置正在損壞。這不應該完成。/

這會對您的程序造成很大的威脅。 B'Coz,因爲它們指向一些任意的內存位置,並且更改該位置的內容可能會導致程序崩潰或表現不佳。

+0

這不會添加任何現有答案不具有的新內容。 – GManNickG 2013-07-26 08:27:20