C中“野指针”的含义是什么?

时间:2010-04-06 09:00:40

标签: c pointers

任何人都可以告诉我,C中的野指针的含义,如何获取它,这在C ++中是否可用?

11 个答案:

答案 0 :(得分:49)

该标准未定义或使用术语“野生”。我会小心“纠正”其他人对其含义的看法,我特别避免引用随机的非规范性互联网垃圾来支持我的立场。

对我来说,这意味着指针既不是指合法对象,也不是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中获得无效的指针值。我最喜欢的是那些试图通过将其地址写入文件来“保存”其对象的人。奇怪的是,当他在程序的不同运行期间回读那些指针值时,他们不再指向他的对象了。想象,那。

但这对我来说意味着什么。由于它不是一个规范性的术语,它意味着说话或写作的人意味着它的意思。问他或她。

答案 1 :(得分:10)

C中的野指针是在第一次使用之前尚未初始化的指针。 来自Wikipedia

  

通过省略来创建Wild指针   必要的初始化之前   第一次使用。因此,严格来说,   编程语言中的每个指针   哪些不强制初始化   以狂野的指针开始。

     

这通常是由于跳跃而发生的   在初始化,而不是   省略它。大多数编译器都能够   警告这个。

例如

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

答案 2 :(得分: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 :(得分:3)

为了得到一个狂野的(又名悬空)指针你:

  • 创建对象
  • 创建指向该对象的指针
  • 删除对象
  • 忘记将指针设置为null

指针现在被归类为“狂野”,因为它指向任意一块内存,在此状态下使用它可能会导致程序出现问题。

答案 4 :(得分:2)

未使用任何地址初始化的指针称为野指针。它可能包含任何垃圾地址,因此解除引用野指针是危险的

答案 5 :(得分:2)

Wild指针是任何使用的指针(特别是作为L_value {ie(* pointer)= x}),同时具有不正确或不再正确的值。它也可以用来描述未定义为指针的内存的使用(可能是通过遵循野指针或使用过时的结构定义)。

没有官方定义。这只是我们在提到某些指针错误或这些错误的结果时使用的词语。

答案 6 :(得分:1)

Wiki

它是指向未初始化对象或状态不佳的对象的指针。使用这个指针会造成麻烦。维基是一个很好的解释来源。

答案 7 :(得分:1)

Wild指针是一个指针,它不指向有效对象(指定类型,如果适用),或指向区分空值(如果适用)。

在此处详细了解Wild Pointer

答案 8 :(得分:0)

Wild指针是一个指针,它存在声明,但尚未定义。我们已经声明了一个指针 - data_type * ptr; //但不定义它包含的地址 * ptr = 100 //野指针不指向任何有效地址。因此我们将得到错误 printf(" ptr:%d",ptr); //我们将得到:0(在gcc编译器中)

答案 9 :(得分:-1)

一个没有找到任何数据类型变量的ponter,该变量调用了Wild指针

答案 10 :(得分:-1)

未初始化的指针称为Wild Pointer。 假设你试试

int * p; //指向任何随机或未知位置。   * p = 16; / 某些未知的内存位置正在被破坏。这绝不应该这样做。 /

这可能会对您的计划造成巨大威胁。 B'Coz因为它们指向某个任意内存位置并且更改该位置的内容可能导致程序崩溃或表现不佳。