您的位置:首页 > 其它

什么是空指针

2018-03-01 16:40 274 查看
空指针说简单点就是一个指针变量其值是0。

在C里面有一个内置的宏NULL,来表示空指针。

C函数的函数参数如果不判空,在程序运行到某些特殊的场景会有意外的崩溃。指针没有判空,而直接拿来用这是一个低级的错误。在某些公司,可能会扣绩效,扣年终奖。。。



用一个程序来演示空指针,以及危害。

#include <stdio.h>

struct str{
int len;
char s[0];
};

struct foo {
struct str *a;
};

int main(int argc, char** argv) {
struct foo f = {0};

if (f.a->s) {
printf("%d\n", f.a->s);
*f.a->s = 8;
}
return 0;
}

/**
我本地的结果为:
-----------------------------
4
Segmentation fault (core dumped)
**/


main函数里面定义了一个结构体,并且将内容初始化为了0。

结构体f其成员指针a没有判空,直接拿来用
f.a->s
。结果是什么呢,
if (f.a->s)
是true,往下执行,打印出
f.a->s
的地址为4!

为什么是4?因为f.a等于0,也就是访问地址为0的那块内存。
->s
是访问成员s的内存,第一个成员len,所占的内存大小是4字节,从地址0处偏移4个字节恰好是4。当然这里提到的内存0或者4肯定不是CPU的真实物理地址0或者4,但是这样的地址肯定不能随便用的。所以执行
*f.a->s = 8;
发生了令C程序员胆寒的Segmentation fault (core dumped)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: