请问,在C语言中,什么是野指针?如何获得它?在C++中是否有这种情况?
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语言中有各种各样的方法可以得到一个无效的指针值。我最喜欢的方式是有个人试图通过将它们的地址写入文件来“保存”他的对象。奇怪的是,在程序的不同运行期间,当他读回这些指针值时,它们不再指向他的对象了。很奇妙吧。
但对我来说,“wild”只是个形容词。由于它不是一个规范的术语,它意味着说话或写作者想要表达的任何含义。问问他或她就知道了。
C语言中的野指针是指在第一次使用之前未被初始化的指针。
来自维基百科:
通过省略必要的初始化而创建野指针。因此,严格地说,在不强制执行初始化的编程语言中,每个指针都开始作为野指针。
这通常是由于跳过初始化而发生的,而不是省略它。大多数编译器都能够警告这种情况。
例如:
int f(int i)
{
char* dp; //dp is a wild pointer
...
}
我会尽力帮助你进行翻译。以下是需要翻译的内容:
这不是一个标准术语。通常用于指向无效内存位置的指针。
int *p;
*p = 0; //P是一个野指针
或者
int *p = NULL;
{
int a;
p = &a; // as soon as 'a' goes out of scope,'p' is pointing to invalid location
}
*p = 0;
获取一个野指针(也称为悬挂指针)的方法:
此时指针被称为“野指针”,因为它指向一个随意的内存空间,在此状态下使用它可能会导致程序出现问题。
未初始化任何地址的指针被称为野指针。它可能包含任何垃圾地址,因此解引用野指针是危险的。
野指针是指任何在值不正确或不再正确的情况下使用的指针(特别是作为L_value {即(*pointer) = x})。它也可以用于描述将未定义为指针的内存用作指针(可能是通过跟随野指针或使用过时的结构定义)。
没有官方定义。这只是我们在引用某些指针错误或这些错误的结果时使用的词语。
这是一个指向未初始化对象或状态不良的对象的指针。使用此指针会引起麻烦。维基百科是一个很好的解释来源。
野指针是一个声明存在但尚未定义的指针。这意味着我们已经声明了一个指针 - data_type *ptr; // 但没有定义它所包含的地址 *ptr = 100 // 野指针不指向任何有效地址,因此我们会得到错误 printf("ptr:%d", ptr); // 在gcc编译器中,我们将得到:0