2010-04-06 70 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