什么是空指针
2018-03-01 16:40
274 查看
空指针说简单点就是一个指针变量其值是0。
在C里面有一个内置的宏NULL,来表示空指针。
C函数的函数参数如果不判空,在程序运行到某些特殊的场景会有意外的崩溃。指针没有判空,而直接拿来用这是一个低级的错误。在某些公司,可能会扣绩效,扣年终奖。。。
用一个程序来演示空指针,以及危害。
main函数里面定义了一个结构体,并且将内容初始化为了0。
结构体f其成员指针a没有判空,直接拿来用
为什么是4?因为f.a等于0,也就是访问地址为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)。
相关文章推荐
- 什么是指针?如何理解指针?指针又是如何定义与使用的?
- 什么是空指针
- 一本介绍C指针的书--指针是什么1.2
- 指针和引用有什么区别
- 3.1.深入理解指针1--什么是指针、指针符号 & *
- 什么是野指针,如何避免?
- 指针申请内存后到底有什么变化?
- 什么是野指针
- null与空串的区别,什么是空指针,如何解决空指针异常
- 解引用结构体指针的值是什么
- 2/7 第2篇----指针是什么
- 单链表的创建,删除,插入,清空全部用一级指针也没发现什么问题啊
- 一本介绍C指针的书--指针是什么1.1
- c语言中定义结构体指针并指向一片内存空间和直接定义一个结构体变量的区别 Node *p=(Node *)malloc(sizeof(Node)); 和 Node p 两个有什么区别??? Node是一
- 指针赋值为NULL;是什么意思呢?
- 引用和指针有什么区别,汇编分析(最真实)
- 面试中遇到的问题:一个指针重复释放会出现什么情况
- 指针和引用有什么区别 .
- 指针与引用有什么区别?
- [C语言]当数组结合指针,会迸发出什么火花?我相信这火花会让你头晕目眩!!