C/C++中NULL的涵义
参考:百度知道
NULL表示空指针,用于表示一个无效的指针,它的值为0(早期C语言的实现中可能有非0空指针,现在已经不用)。对指针置NULL即标记指针无效,避免“野指针”的恶果。
NULL在C/C++标准库中被定义为一个宏,一般为:
#define NULL ((void*)0) /*C中的“标准”写法,NULL被替换为一个void*类型的指针右值,值等于0;由于是void*类型,可以隐式转化为其它类型的指针。*/
#define NULL 0 //C++,相对C简化定义的原因是C++中void*无法自由隐式转换为其它类型的指针,而字面量0可以隐式转换为指针类型;尽管它实际上可以被作为整数0使用而不引起编译问题,但要注意,从设计目的上而言,NULL应当总是只作为空指针使用。
char c = NULL相当于char c = 0,也就是把c初始化为0。0在这里并不是空指针的意思,而是隐式转换成的字符'\0'——值为0的char字符。在C/C++的一般实现中,这样的行为(值为0的数值类型,无论是void*或int,转换为char的值还是0)是明确的,但这种用法并不恰当。 下面两个例子参考博文:C语言中的"NULL"到底是什么?又不是什么?有什么用?怎么用?
Exp1:
#include <stdio.h>
void fun(int *node)
{
static int N=;
node=&N;
}
int main()
{
int *node=NULL;
int a=;
fun(node);
a=*node;
printf("%d\n",a);
return ; }
上述例子的输出结果是100,0还是段错误?答案是段错误,由第12行a=*node引起。
想到100,估计是受第4行static的影响,但static定义的是N。static定义的变量在函数中如果发生改变,函数调用结束后,改变仍然有效;但node作为一般的函参,函数调用结束后,值不会改变。所以,fun()调用结束后node的值依然为NULL(不指向任何内存空间)。若想要改变,可以使用指针的指针作为函参。
想到0,估计是考虑到NULL的值为0。但事实上NULL被定义为0或(void*)0,意思是node不指向任何内存空间,*node(解指针)的结果就是segmentation fault.
Exp2:
#include <stdio.h>
int main(...)
{
int *iPtr1 = NULL;
int *iPtr2 = ;
//error: invalid conversion from `int' to `int*'
int *iPtr3 = ;
//error: invalid conversion from `void*' to `int*'
int *iPtr4 = ((void* ));
return ;
}
其中第3个和第4个的指针赋值是错误的。
第2个指针赋值正确是因为,0是一个特殊的数字,可以被隐式转换成int*类型。
第4个指针赋值错误,是因为C++不支持(void*)到(int*)的隐式转换。但C++支持(int*)到(void*)的隐式转换。
C/C++中NULL的涵义的更多相关文章
- SQLSERVER中NULL位图的作用
SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...
- tcpdump的使用以及通信协议中常见缩写涵义(持续不定期更新)
1. tcpdump的使用 在tcpdump输出中 Flags: [S],表示该TCP报文段包含SYN标志 [F],表示该TCP报文段包含FIN标志 seq:TCP首部32位序号值 win:接收通告窗 ...
- Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
本文由我们团队的 康祖彬 童鞋撰写,这是他的个人主页:https://kangzubin.cn. 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居 ...
- sql server中NULL导入decimal字段时报错
sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...
- mysql中NULL和null的区别
接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...
- JS中NULL和undifined区别及NULL的作用
1.博客地址:http://www.cnblogs.com/eastday/archive/2010/03/03/1677324.html 2.参考地址2:https://www.zhihu.com/ ...
- sql中NULL的问题
sql中NULL的问题 今天一不小心在sql中写出以下脚本 select defaultPositionId from TableName where UserId=1100528 and def ...
- JavaScript中Null和Undefined的深渊
探索JavaScript中Null和Undefined的深渊 当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单 ...
- SQL Server中NULL的一个测试
我们都知道SQL Server中NULL是一个很特殊的存在,因为NULL不会等于任何值,且NULL也不会不等于任何值.对于NULL我们只能使用IS或IS NOT关键字来进行比较. 我们先来看看下面一个 ...
随机推荐
- KSFramework配置表:扩展表格解析类型
解析和扩展表格 配置表示例 配置表模块在编译时,把Excel转化成TSV,并根据Excel的头部信息,生成对应的代码: 比如源码库中的Test.xlsx Excel文件,两个列头,Id和Value,其 ...
- UBUNTU添加新的分辨率
首先,直接运行xrandr查看下分辨率的情况: $ xrandr Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 4096 x 40 ...
- Eclipse自动打开实现类原型的工具
http://eclipse-tools.sourceforge.net/implementors/ I always use this implementors plugin to find all ...
- poj 2186 Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29908 Accepted: 12131 De ...
- View.inflate和LayoutInflater的inflate方法区别
平时ListView加载item中,adapter的getView方法中,我们经常用到: LayoutInflater.from(mContext).inflate(R.layout.it ,pare ...
- Zygote进程【2】——Zygote的分裂
在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...
- 一些重要的mel命令
一些重要的mel命令 查询多边形顶点 xform -q -worldSpace -t "pCylinderShape1.vtx[0]" 设置顶点坐标 xform -objectSp ...
- 事件--c#
以上是事件的几个操作. 事件由五个组件构成: 具体作用如下: 事件声明: event 委托类型 事件名:例子: public event EventHandler Elapsed; 还可同时声明几个 ...
- window对象的screen详解
screen.availHeight 返回屏幕的高度(不包括Windows任务栏)screen.availWidth 返回屏幕的宽度(不包括Windows任务栏)screen.colo ...
- js对象定义
JS中的对象定义方式,跟服务端,还是有很大差别的! 现在来说一下JS类的定义 工厂模式 function creatHeven(name,age){ var temp =new Object(); t ...