指针是否可能指向0x000000的地址

时间:2014-09-19 13:17:33

标签: c++ pointers

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

变量的地址是否可以合法地赋值为0x000000,如果是,这是否意味着例如:

#define NULL 0x00000000
int example;
int * pointerToObject = &example;

if(pointerToObject != NULL)

会返回false吗?

4 个答案:

答案 0 :(得分:9)

不,您无法获得p返回p != NULL的有效(=非空)指针false

但请注意,这并不意味着"地址0" (不管它是什么意思)。在引用地址和指针时,C ++是故意非常抽象的。有一个空指针值,,即指向任何地方的指针值。创建这样一个指针的方法是将空指针常量分配给指针变量。在C ++ 03中,空指针常量是文字0,可选地带有后缀(例如0L)。 C ++ 11添加了另一个空指针常量,即文字nullptr

如何在内部内部表示空指针值超出了C ++语言的范围。在某些(大多数?)系统中,地址值0x00000000用于此目的,因为用户程序无法指向的任何内容都可以合法地驻留在该地址。但是,没有什么能阻止硬件平台使用值0xDEADBEEF来表示空指针。在这样的平台上,这段代码:

int *p = 0;

必须编译为将值0xDEADBEEF分配给变量p占用的4个字节。

在这样的平台上,您可以合法地获得指向地址0x00000000的指针,但它不会与0NULLnullptr进行比较。


另一种看待这种情况的方法是以下声明等效:

int *p = 0;
int *q = reinterpret_cast<int*>(0);
使用空指针值初始化

pq初始化地址为0(当然,取决于reinterpret_cast中使用的映射)。

答案 1 :(得分:3)

是的,当然,你可以有空指针。对于空指针,检查中的问题将返回false。例如,malloc()可以在失败时返回空指针,并且您可以更好地检查它。

0x000000被编译器解释为零文字,因此可以产生空指针。与代码from here相同:

int* ptr = int();

答案 2 :(得分:2)

首先必须进行不计算,以及在执行给定程序时如何分配内存。

有三种记忆:

  1. 固定内存
  2. 堆叠内存
  3. 堆内存
  4. 固定内存

    • 可执行代码
    • 全局变量
    • 不适合机器指令的常量结构。 (常数数组,字符串,浮点数,长整数等)。
    • 静态变量。
    • 非递归语言中的子例程局部变量(例如早期 FORTRAN)。

    堆栈内存

    • 函数的局部变量,其大小可以在调用时确定 时间。
    • 在函数调用时保存的信息并在函数返回时恢复:
      • 被调用者参数的值
    • 注册值:
      • 返回地址(PC的值)
      • 帧指针(FP的值)
        • 其他登记册
    • 静态链接(待讨论)

    堆内存

    • 动态大小不同的结构(例如可变长度数组) 或字符串)。
    • 动态分配的结构(例如,链接中的记录) 列表)。
    • 函数调用创建的结构必须在之后生存 呼叫返回。

    的问题:

    • 分配和可用空间管理
    • 解除分配/垃圾回收

    如何将程序加载到内存中?

    当程序加载到内存中时,它被组织成三个内存区域,称为段:文本段,堆栈段和堆段。文本段(有时也称为代码段)是程序本身的编译代码所在的位置。这是要执行的程序步骤的机器语言表示,包括构成程序的所有功能,包括用户定义和系统。

    系统内存的其余两个区域是编译器可以为数据存储分配存储空间。

    如何组织记忆

    enter image description here

    当然,您在该图片中看到的是相对于偏移的。

    Conlcusion

    即使程序从地址0x00000000开始分配到内存中,也无法将该地址设置为程序使用的常量,静态或dinamic数据。由于这些元素存储在dataheapstack部分中,同时这些部分是在.text部分之后分配的。

    讨论

    我认为NULL指针设置为0x000000,原因是没有办法在该地址分配变量(dinamic,local,static或global)。

答案 3 :(得分:0)

C ++不可能访问地址为0的内存.C ++为空指针保留该值(但不一定是该物理地址)。

因此,您的陈述if (pointerToObject != NULL) 永远不会false

Pre C ++ 11您使用NULL来引用该指针,0通常是定义为(void*)0nullptr的宏。在C ++ 11中,关键字delete p用于该特定指针值。

一个有用的属性是,如果p == nullptrfree将是良性的。 C中的{{1}}具有相似的属性。