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