c++中的空指针
Null pointer in C++
当我在c++中声明一个空指针为int* p=0
时,这是否意味着零是整数指针类型的一些特殊常数,或者这是否意味着p
指向地址0x0
?当然,0x0
必须是一个特殊的地址,c++在分配变量/数组期间永远不会接触到它。
c++标准定义整型常量0转换为空指针。这并不意味着空指针指向地址0x0。它只是意味着文本'0'在转换为指针时变成空指针。
当然,使空指针具有0x0
以外的表示形式是相当复杂的,因此大多数编译器只是让0x0
作为空指针地址,并确保没有在零处分配任何内容。
注意,使用这种零转换被认为是糟糕的风格。使用NULL
(这是一个预处理器宏,定义为0
, 0L
或其他零积分常量),或者,如果您的编译器足够新,可以使用nullptr
。
表示值为0的整型常量表达式在c++中具有特殊含义;它称为空指针常量。当使用这样的表达式初始化指针或对指针赋值时,实现确保该指针包含适当类型的空指针值。这保证是一个不同于任何指向真正对象的指针的值。它可以有也可以没有" 0 "的表示。
ISO/IEC 14882:2011 4.10 [conf .ptr]/1:
空指针常量是一个整型常量表达式(5.19),值为0的整型右值或
std::nullptr_t
类型的右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,该值与其他所有对象指针或函数指针类型的值不同。
这是一个特殊值,根据标准保证它永远不会等于指向对象或函数的指针。操作符&
的地址永远不会产生空指针,也不会产生任何成功的动态内存分配。您不应该将其视为地址0,而应该将其视为指示指针不指向任何地方的特殊值。有一个宏NULL
用于此目的,新的习语是nullptr
。
这意味着它没有指向任何东西
指针的值仅为0。这并不一定意味着它指向地址0x0。NULL
宏,只是一个0常量。
指针指向地址0。在大多数平台上,这是非常特殊的,但您应该使用NULL
,因为它并不总是0
(但经常)。
是。0是一个特殊的常数。事实上,它是唯一可以在不使用显式强制转换的情况下在以下语句中使用的整型常量:
int *pi = 0; //ok
char *pc = 0; //ok
void *pv = 0; //ok
A *pa = 0; //ok
一切都可以正常编译。
但是,如果你用这个代替:
int *pi = 1; //error
char *pc = 2; //error
void *pv = 3; //error
A *pa = 4; //error
都将给出编译错误。
在c++ 11中,当你表示空指针时,你应该使用nullptr
,而不是0
。
在你的例子中'p'是int型的地址。通过设置p为0,你说有一个地址为0的整数。约定是0是"非有效地址地址",但这只是一个约定。
实际上地址0通常是"未映射的"(即没有内存支持该地址),因此您将在该地址处得到错误。但在某些嵌入式系统中却不是这样。
您也可以选择任何随机地址(例如0xffff7777或任何其他值)作为"空"地址,但您将违反惯例并使许多阅读您的代码的人感到困惑。通常使用0,因为大多数语言都支持有效地测试is- 0和not- 0。
参见这个相关问题:为什么地址0用于空指针?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 将多映射转换为空指针,然后转换回多映射