这个毫无意义的问题是指针,有人能指出我正确的方向
变量的地址是否可以合法地赋值为0x000000,如果是,这是否意味着例如:
#define NULL 0x00000000
int example;
int * pointerToObject = &example;
if(pointerToObject != NULL)
会返回false吗?
答案 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
的指针,但它不会与0
,NULL
或nullptr
进行比较。
另一种看待这种情况的方法是以下声明不等效:
int *p = 0;
int *q = reinterpret_cast<int*>(0);
使用空指针值初始化 p
。 q
初始化地址为0
(当然,取决于reinterpret_cast
中使用的映射)。
答案 1 :(得分:3)
是的,当然,你可以有空指针。对于空指针,检查中的问题将返回false
。例如,malloc()
可以在失败时返回空指针,并且您可以更好地检查它。
0x000000
被编译器解释为零文字,因此可以产生空指针。与代码from here相同:
int* ptr = int();
答案 2 :(得分:2)
首先必须进行不计算,以及在执行给定程序时如何分配内存。
有三种记忆:
的问题:
当程序加载到内存中时,它被组织成三个内存区域,称为段:文本段,堆栈段和堆段。文本段(有时也称为代码段)是程序本身的编译代码所在的位置。这是要执行的程序步骤的机器语言表示,包括构成程序的所有功能,包括用户定义和系统。
系统内存的其余两个区域是编译器可以为数据存储分配存储空间。
当然,您在该图片中看到的零是相对于偏移的。
即使程序从地址0x00000000
开始分配到内存中,也无法将该地址设置为程序使用的常量,静态或dinamic数据。由于这些元素存储在data
,heap
或stack
部分中,同时这些部分是在.text
部分之后分配的。
我认为NULL
指针设置为0x000000,原因是没有办法在该地址分配变量(dinamic,local,static或global)。
答案 3 :(得分:0)
C ++不可能访问地址为0的内存.C ++为空指针保留该值(但不一定是该物理地址)。
因此,您的陈述if (pointerToObject != NULL)
永远不会为false
。
Pre C ++ 11您使用NULL
来引用该指针,0
通常是定义为(void*)0
或nullptr
的宏。在C ++ 11中,关键字delete p
用于该特定指针值。
一个有用的属性是,如果p == nullptr
,free
将是良性的。 C中的{{1}}具有相似的属性。