空指针就是指向不可访问区域的的指针,它的值为NULL,地址一般是内存的首地址。详情见代码1、2及其运行结果。
NULL是标准库定义的等于0的常量符号。
不可访问和内存的划分有关。系统会在每个程序被调用的时候为它分配一个内存段,这个内存段是物理地址经过偏移计算得来的,用来映射程序的所有内容。其中,空指针指向的内存地址和实际的物理地址不存在映射,也就是通过空指针所指向的地址找不到对应的物理地址。
空指针的应用。指针在被创建时会随机指向一个内存地址,如果不加限制可能造成非法访问、写越界(写越界的危害自己想象)。所以指针被创建的时候通常会指向一个有意义的内存。如果暂时没有用到,则赋值为NULL,表示处于闲置状态,不指向任何有意义的对象。同时指针指向的内存被释放的时候也需要讲指针置空,否则指针将对一个已经释放的内存继续保有访问的权限,同样具有安全问题。
空指针的危害。空指针指向不可访问的区域,如果程序使用空指针进行访问,将会导致程序出错、中断。详情见代码3及其运行结果。在使用一个指针变量的时候对其进行非空判断可以避免这种情况。这也是通常的做法。
代码1及其运行结果
#include
#include
int main()
{
//char * str = (char*)malloc(sizeof(char)*5);
char * str = NULL;
printf("str1 is %s\n", str);
printf("str2 is %x\n", &str);
getchar();
return 0;
}
代码2及其运行结果
代码3机器运行结果
#include
typedef struct
{
int a_;
int b_;
}test_;
void test(test_* str)
{
int a = str->a_;
int b = str->b_;
printf("a is %d, b is %d\n");
}
int main()
{
test(NULL);
getchar();
return 0;
}