系统版本:Ubuntu 14.04_64
编译工具:gcc (version 4.8.4)
最后更新:2022-08-05
0x01 空指针&野指针小结 1.空指针概念:特殊的指针变量,表示不指向任何内容
作用:在指针变量创建的时候,可以初始化NULL
注意:不能对空指针进行解引用(取指针指向的地址的内容)等操作
例1:
#includeint main(){ char *p = NULL; strcpy(p, "abcd"); //错误,对空指针指向的内存空间进行拷贝操作 return 0; }
例2:
#includeint main(){ char *p = NULL; printf("%02xn", *p);//错误,对空指针进行解引用操作 return 0; }
例3:
#include2.野指针int main(){ char *p = NULL; printf("%02xn", p); //正确,输出的NULL地址,一般为0 return 0; }
概念:野指针指向一个已经释放的内存或者未申请过的内存空间
注意:不要对野指针进行解引用操作
例4:
#include1)常见野指针int main(){ char *p = 0x1234; strcpy(p, "abcd");//错误,虽热不是空指针,但是没有申请过内存空间 return 0; }
1.指针变量未初始化
2.释放堆区的指针后没有置空(造成误用)
3.指针操作超越了变量作用域
例5:
#includeint* func() { int a = 10; int * p = &a; return p; } void test() { //1 指针变量未初始化 int * p1; printf("%dn", *p1); //gcc下可以运行,vs下报错 //2 指针释放后未置空 int * p2 = (int*)malloc(sizeof(int)); *p2 = 100; printf("%dn", *p2); free(p2); printf("%dn", *p2); //不报错,但打印乱码,可能造成误用 p2 = NULL; printf("%dn", *p2); //置空后报错,防止误用 //3 指针操作超越变量作用域 int * p3 = func(); printf("%dn", *p3); //系统保留一次局部变量地址func中的p printf("%dn", *p3); //系统释局部变量地址func中的p,打印乱码 } int main(){ test(); return 0; }
另外,空指针可以free释放,野指针不能释放。
以上。
参考资料:
1.https://www.bilibili.com/video/BV18y4y1H7pt?p=15&spm_id_from=pageDriver&vd_source=400083cd545d1a00e016c8759f136df3



