C++ 指针是否可能指向0x000000地址

C++ 指针是否可能指向0x000000地址,c++,pointers,C++,Pointers,这个毫无意义的问题是关于指针的,有人能给我指出正确的方向吗 变量的地址是否可以合法地分配0x000000的值,如果是,这是否意味着例如: #define NULL 0x00000000 int example; int * pointerToObject = &example; if(pointerToObject != NULL) 是否将返回false?是的,当然,可以使用空指针。对于空指针,问题中的检查将返回false。例如,malloc() 0x000000被编译器解释为零文本

这个毫无意义的问题是关于指针的,有人能给我指出正确的方向吗

变量的地址是否可以合法地分配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添加了另一个空指针常量,即literal
nullptr

空指针值如何在内部表示超出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);