【问题标题】:What is the meaning of "wild pointer" in C?C中的“野指针”是什么意思?
【发布时间】:2011-02-04 17:37:33
【问题描述】:

谁能告诉我,C语言中野指针的含义,如何获得它,这在C++中可用吗?

【问题讨论】:

  • 野指针喜欢破坏这个地方。
  • 这不是狂野,而是愤怒......
  • 一个3个月后还在乱跑乱戳,没人能让它安静下来的。

标签: c pointers


【解决方案1】:

Wiki

它是指向未初始化对象或状态不良对象的指针。使用这个指针会带来麻烦。 wiki 是一个很好的解释来源。

【讨论】:

  • 如果一个对象违反了它的不变量,也可以说它处于坏状态,但指向它的指针不是野指针。所以这个定义有些错误。
  • 这取决于坏状态的性质。但我明白你的意思,我已经参考了维基页面的确切定义。
  • 请注意,该语言要求始终可以使用通过 unsigned char 类型的左值进行访问来读取或写入对象,即使它在解释为其声明的类型时处于错误状态。
【解决方案2】:

这不是标准术语。它通常用于引用指向无效内存位置的指针。 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;

【讨论】:

  • 当指针指向的位置超出范围(或被释放)时,它变成悬空指针,而不是野指针。 Wild 指针是一个未初始化的指针。
  • @Technowise:我不同意。我听说这两个术语可以互换使用。
【解决方案3】:

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

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

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

例如

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

【讨论】:

  • 这个术语也用于一个指针,它已经被初始化了,但是现在它变成了一个野性死的。见 Naveen 的回答:stackoverflow.com/questions/2583656/2583678#2583678
  • @Magnus - 感谢您的编辑! @sbi - 我通常听说过你所描述的被称为“悬空指针”的状态的指针,但你是正确的,它们实际上与“野生指针”处于相同的状态。
  • 不太一样——在许多具有动态内存的系统中,悬空指针指向的数据在被重用之前似乎是有效的,而野指针指向垃圾。
【解决方案4】:

要获得一个狂野(又名悬空)指针:

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

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

【讨论】:

  • 我认为你必须称它们为 悬空指针wild 是未初始化的
  • +1 用于提及术语“悬空指针”。正如 Eineiki 所说,我怀疑悬空指针不是野指针。
  • 标准没有定义“wild”或“dangling”,所以这些更正充其量是可疑的。该标准使用术语“有效”和“无效”。
  • @sbi:仅在块范围内(即自动存储持续时间)。将该定义放在文件范围内,并且需要将其初始化为NULL。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    一个没有定位任何数据类型变量的指针,该变量称为野指针

    【讨论】:

      【解决方案7】:

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

      对我来说,这意味着一个既不指向合法对象也不是 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 指出该术语不精确并给出 4 个可能的原因。
      【解决方案8】:

      野指针是指在其值不正确或不再正确时使用的任何指针(特别是作为 L_value {ie (*pointer) = x } )。它也可以用来描述使用未定义为指针的内存作为指针(可能是跟随一个野指针或使用过时的结构定义)。

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

      【讨论】:

        【解决方案9】:

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

        在此处阅读有关Wild Pointer 的更多信息

        【讨论】:

          【解决方案10】:

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

          int *p; //指向任何随机或未知的位置。 *p=16; /一些未知的内存位置被破坏了。永远不要这样做。/

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

          【讨论】:

          • 这不会添加现有答案没有的任何新内容。
          【解决方案11】:

          Wild 指针是一个存在声明但尚未定义的指针。意味着我们已经声明了一个指针 - 数据类型 *ptr; //但不定义它包含哪个地址 *ptr=100//wild 指针没有指向任何有效的地址。所以我们会得到 ERROR printf("ptr:%d",ptr);//我们会得到:0(在gcc编译器中)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-04
            • 1970-01-01
            • 1970-01-01
            • 2018-04-09
            • 2011-01-27
            • 2012-11-02
            • 1970-01-01
            • 2015-10-13
            相关资源
            最近更新 更多