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

sag*_*gar 22 c pointers

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

jan*_*nks 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
   }
}  
Run Code Online (Sandbox Code Playgroud)

等等等等.有各种方法可以在C中获得无效的指针值.我最喜欢的是那些试图通过将其地址写入文件来"保存"其对象的人.奇怪的是,当他在程序的不同运行期间回读那些指针值时,他们不再指向他的对象了.想象,那.

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

  • 用于指出该术语的+1是不精确的,并给出了4个可能的原因. (11认同)

Ama*_*ena 10

C中的Wild指针是一个在第一次使用之前尚未初始化的指针.来自维基百科:

通过在首次使用之前省略必要的初始化来创建Wild指针.因此,严格地说,编程语言中不强制初始化的每个指针都以野指针开始.

这通常是由于跳过初始化而不是省略它而发生的.大多数编译器都能够对此发出警告.

例如

int f(int i)
{
    char* dp;    //dp is a wild pointer
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 该术语也用于一个_had_已被初始化的指针,但现在变成了一个荒谬的死神.见Naveen的回答:http://stackoverflow.com/questions/2583656/2583678#2583678 (2认同)

Nav*_*een 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;
Run Code Online (Sandbox Code Playgroud)

  • 当指针指向的位置超出范围(或被释放)时,它变为悬空指针,而不是狂野.Wild指针是未初始化的指针. (3认同)

Dan*_*ani 1

维基百科

它是指向未初始化对象或状态错误的对象的指针。使用这个指针会带来麻烦。维基百科是一个很好的解释来源。