空指针 隐式类型转换-空指针0可以被隐式类型转换为整型,会带来什么隐患?

问题描述

空指针0可以被隐式类型转换为整型,会带来什么隐患?

以前都是用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题。

解决方案

  1. 一个是语义上的,NULL用来表示空指针,而0是数字的概念,分别开来,从语法上好理解和区分,防止混淆
  2. 防止隐式转换,比如该是指针的地方,却用了数字,该是数字的地方却用了指针。
  3. 所以在C++11中,引入了nullptr的关键字来代替NULL,它就不是数字0了

解决方案二:

有一些细节问题,比如
if (p = 0)
由于将==写成了=,结果将p设置为野指针了

再比如 **p 被误写作 *p,这种错误很难发现。

解决方案三:

定义 NULL 只是为了方便代码的阅读,NULL 本身就是 0

解决方案四:

除了看起来不一样,其他都一样

解决方案五:

指针就是计算机内存地址,也就是整形。 0即空指针,没啥隐患。

解决方案六:

1楼和2楼的同学已经给出了答案,同意。

解决方案七:

NULL这是0,本身没什么问题,只是你做逻辑判断的时候容易出错,最好用nullptr,代替。
#define NULL 0
int a=NULL; 没问题,如果写成int a=nullptr, 就不行了,所以防止出错。

解决方案八:

C中本来指针就 不能算整数,只是可以用整数表示

C++ 干脆用 0 表示 NULL指针;
这样遇到 函数重载 参数分别是 整数和指针 的时候,
传入NULL指针,
容易出现二义性错误
这是个很麻烦,但是有很少遇到的特性
一旦出现,就会很麻烦
nullptr 则不会
所以有编译器定义了nullptr,标准也采用了
此前有些书籍,也讨论过这个问题.

解决方案九:

路过水一贴,O(∩_∩)O。

时间: 2024-12-03 06:09:33

空指针 隐式类型转换-空指针0可以被隐式类型转换为整型,会带来什么隐患?的相关文章

总结Javascript中的隐式类型转换_javascript技巧

JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object.object是引用类型,其它的五种是基本类型或者是原始类型. 比如像是Number() ,还是parseInt() .parseFloat()都属于显示类型转换(强制类型转换): 这一节我们来看一下隐式类型转换(自动转换). 数值自动转换为字符串 var a = 123; alert(a+'456'); // 输出 123456 "+"号为连接符 字符串

小心MySQL的隐式类型转换陷阱

1. 隐式类型转换实例 今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值) SELECT f_col3_id,f_qq1_id FROM d_dbname.t_tb1 WHERE f_col1_id=1226391 and f_col2_id=1244378 and f_qq1_id in (12345,23456,34567,45678,56789,67890,78901,89012,90123,901231,901232,90

MySQL 的隐式类型转换

换 十六进制的值和非数字做比较时,会被当做二进制串,和数字做比较时会按下面的规则处理 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较 所有其他情况下,两个参数都会被转换为浮点数再进行比较 注意一个安全问题:假如 password 类型

JavaScript运算符规则与隐式类型转换详解

本文中涉及的参考资料全部声明在了JavaScript 数据结构学习与实践资料索引 . 隐式类型转换 在 JavaScript 中,当我们进行比较操作或者加减乘除四则运算操作时,常常会触发 JavaScript 的隐式类型转换机制;而这部分也往往是令人迷惑的地方.譬如浏览器中的 console.log 操作常常会将任何值都转化为字符串然后展示,而数学运算则会首先将值转化为数值类型(除了 Date 类型对象)然后进行操作. 我们首先来看几组典型的 JavaScript 中运算符操作结果,希望阅读完本

JavaScript隐式类型转换_javascript技巧

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 复制代码 代码如下: 3 + true; // 4 结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只

c++隐式类型转换示例分享_C 语言

复制代码 代码如下: /*=============================================================================#     FileName: explicit_try.cc#         Desc: 验证含有一个参数的非explicit构造函数是否可以拷贝初始化=============================================================================*/#in

C#的隐式类型转换

在C#语言中,一些预定义的数据类型之间存在着预定义的转换.比如,从int类型转换到long类型.C#语言中数据类型的转换可以用分为两类:隐式转换(implicit conversions)和显式转换(explicit conversions).本章我们将详细介绍这两类转换. 6.1 隐式类型转换 隐式转换就是系统默认的.不需要加以声明就可以进行的转换.在隐式转换过程中,编译器无需对转换进行详细检查就能够安全地执行转换.比如从int类型转换到long类型就是一种隐式转换.隐式转换一般不会失败,转换

C++中通过重载避免隐式类型转换

以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西: class UPInt { // unlimited precision public: // integers 类 UPInt(); UPInt(int value); ...};//有关为什么返回值是const的解释,参见Effective C++ 条款21const UPInt operator+(const UPInt& lhs, const UPInt& rhs);UPInt upi1, upi2;...UPInt

浅析JavaScript中的隐式类型转换

        这篇文章主要是对JavaScript中的隐式类型转换进行了详细分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 .google和维基百科中没有找到"显示类型转换","隐式类型转换"的字眼.暂且这么称呼.   一. 运算中存在的隐式类型转换    1, "+"运算符     代码如下: var a = 11, b = '22';