C++ 指针是否可能指向0x000000地址
这个毫无意义的问题是关于指针的,有人能给我指出正确的方向吗 变量的地址是否可以合法地分配0x000000的值,如果是,这是否意味着例如:C++ 指针是否可能指向0x000000地址,c++,pointers,C++,Pointers,这个毫无意义的问题是关于指针的,有人能给我指出正确的方向吗 变量的地址是否可以合法地分配0x000000的值,如果是,这是否意味着例如: #define NULL 0x00000000 int example; int * pointerToObject = &example; if(pointerToObject != NULL) 是否将返回false?是的,当然,可以使用空指针。对于空指针,问题中的检查将返回false。例如,malloc() 0x000000被编译器解释为零文本
#define NULL 0x00000000
int example;
int * pointerToObject = &example;
if(pointerToObject != NULL)
是否将返回false?是的,当然,可以使用空指针。对于空指针,问题中的检查将返回
false
。例如,malloc()
0x000000
被编译器解释为零文本,因此可以生成空指针。与代码相同:
< C++无法访问带有地址0的内存。C++为<>强>空指针>/P>保留了值(但不一定是物理地址)。
因此,您的语句如果(pointerToObject!=NULL)
将永远不会false
在C++11之前,您可以使用NULL
引用该指针,该指针通常是定义为0
或(void*)0
的宏。在C++11中,关键字nullptr
用于该特定指针值
一个有用的属性是,如果p==nullptr
,则delete p
将是良性的free
具有类似的属性。否,您无法获取其p!=NULL
返回false
然而,请注意,这并不意味着任何关于“地址0”(不管它是什么意思)的事情。在引用地址和指针时,C++是非常抽象的。有一个空指针值,即指针的值不指向任何地方。创建此类指针的方法是将空指针常量赋给指针变量。在C++03中,空指针常量是文本0
,可选地带有后缀(例如0L
)。C++11添加了另一个空指针常量,即literalnullptr
空指针值如何在内部表示超出C++语言的范围。在一些(大多数?)系统上,使用地址值
0x00000000
,因为用户程序可以指向的任何东西都不能合法地驻留在该地址。但是,没有什么可以阻止硬件平台使用值0xDEADBEEF
来表示空指针。在此平台上,此代码:
int *p = 0;
必须编译为将值0xDEADBEEF
分配到变量p
占用的4个字节
在这样的平台上,您可以合法地获得指向地址的指针0x00000000
,但它不能与0
、NULL
或nullptr
进行比较
另一种看待这一点的方式是,以下声明并不等同:
int *p = 0;
int *q = reinterpret_cast<int*>(0);
int*p=0;
int*q=重新解释(0);
p
用空指针值初始化q
是用地址0
初始化的(当然,这取决于reinterpret\u cast
中使用的映射)。执行给定程序时,首先必须了解如何分配内存
内存有三种:
- 可执行代码
- 全局变量
- 不适合机器指令的常量结构。 (常量数组、字符串、浮点、长整数等)
- 静态变量
- 非递归语言中的子程序局部变量(例如早期 FORTRAN)
- 函数的局部变量,其大小可在调用时确定 时间
- 在函数调用时保存并在函数返回时恢复的信息:
- 被调用参数的值
- 寄存器值:
- 返回地址(PC的值)
- 帧指针(FP的值)
- 其他登记册
- 静态链接(待讨论)
- 大小动态变化的结构(例如可变长度数组 或字符串)
- 动态分配的结构(例如链接数据库中的记录) 列表)
- 由函数调用创建的结构必须在 呼叫返回
- 分配和自由空间管理
- 释放/垃圾回收
0x00000000
开始分配到内存中,存储机制也无法将该地址分配给程序使用的常量、静态或动态数据。由于所有这些元素都存储在数据
、堆
或堆栈
部分中,同时这些元素分配在文本
部分之后
讨论
我认为
NULL
指针设置为0x000000的原因是无法在该地址分配变量(dinamic、本地、静态或全局)。可能重复:?无法保证NULL
“指向任何地方的指针都无效”,在指针变量中生成与相应大小的
int *p = 0;
int *q = reinterpret_cast<int*>(0);