悬空指针
指向已删除(或释放)的内存位置的指针称为悬空指针。指针用作悬空指针有三种不同的方式
- 内存分配
// Deallocating a memory pointed by ptr causes // dangling pointer #include
#include int main() { int *ptr = (int *)malloc(sizeof(int)); // After below free call, ptr becomes a // dangling pointer free(ptr); // No more a dangling pointer ptr = NULL; } - 函数调用
// The pointer pointing to local variable becomes // dangling when local variable is not static. #include
int *fun() { // x is local variable and goes out of // scope after an execution of fun() is // over. int x = 5; return &x; } // Driver Code int main() { int *p = fun(); fflush(stdin); // p points to something which is not // valid anymore printf("%d", *p); return 0; } 输出:
A garbage Address
如果x是静态变量,则不会出现上述问题(或p不会悬空)。
// The pointer pointing to local variable doesn't // become dangling when local variable is static. #include
int *fun() { // x now has scope throughout the program static int x = 5; return &x; } int main() { int *p = fun(); fflush(stdin); // Not a dangling pointer as it points // to static variable. printf("%d",*p); } 输出:
5
- 变量超出范围
void main() { int *ptr; ..... ..... { int ch; ptr = &ch; } ..... // Here ptr is dangling pointer }
虚空指针
无效指针是一种特定的指针类型– void * –指向存储中某个数据位置的指针,它没有任何特定的类型。空是指类型。基本上,它指向的数据类型可以是任何类型。如果我们将char数据类型的地址分配给void指针,它将成为char指针,如果是int数据类型,则将成为int指针,依此类推。任何指针类型都可以转换为空指针,因此它可以指向任何值。
重要事项
- void指针不能被取消引用。但是,可以使用类型转换void指针来完成
- 由于缺少具体的值和大小,因此无法对void指针进行指针算术运算。
例子:
#include
int main()
{
int x = 4;
float y = 5.5;
//A void pointer
void *ptr;
ptr = &x;
// (int*)ptr - does type casting of void
// *((int*)ptr) dereferences the typecasted
// void pointer variable.
printf("Integer variable is = %d", *( (int*) ptr) );
// void pointer is now float
ptr = &y;
printf("\nFloat variable is= %f", *( (float*) ptr) );
return 0;
}
输出:
Integer variable is = 4
Float variable is= 5.500000
有关详细信息,请参见空指针文章。
空指针
NULL指针是没有指向任何内容的指针。如果没有将地址分配给指针的情况,则可以简单地使用NULL。
#include
int main()
{
// Null Pointer
int *ptr = NULL;
printf("The value of ptr is %p", ptr);
return 0;
}
输出 :
The value of ptr is (nil)
重要事项
- NULL与未初始化的指针–未初始化的指针存储未定义的值。空指针存储定义的值,但是环境定义的值不是任何成员或对象的有效地址。
- NULL vs空指针–空指针是一个值,而空指针是一个类型
野指针
尚未初始化为任何值(甚至不是NULL)的指针称为野生指针。可以将指针初始化为一个非NULL垃圾值,该值可能不是有效地址。
int main()
{
int *p; /* wild pointer */
int x = 10;
// p is not a wild pointer now
p = &x;
return 0;
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。