Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将NULL分配给x64指针_C++_Windows_64 Bit - Fatal编程技术网

C++ 将NULL分配给x64指针

C++ 将NULL分配给x64指针,c++,windows,64-bit,C++,Windows,64 Bit,我有一个在x86平台上运行良好的进程。 现在我将其编译为x64,突然我无法为指针分配NULL。 如果我这样做: void* pointy = NULL; 它将指向0x0000000100000000 发生了什么事?Null不一定是按位零。它的价值是由实现定义的 也就是说,这些都是一样的: void* pointy = NULL; void* pointy = 0; void* pointy = nullptr; 它们将空指针值分配给pointy。这个值在位级别上是什么是完全未指定的,并且不

我有一个在x86平台上运行良好的进程。
现在我将其编译为x64,突然我无法为指针分配NULL。
如果我这样做:

void* pointy = NULL;
它将指向0x0000000100000000

发生了什么事?

Null不一定是按位零。它的价值是由实现定义的


也就是说,这些都是一样的:

void* pointy = NULL;
void* pointy = 0;
void* pointy = nullptr;
它们将空指针值分配给
pointy
。这个值在位级别上是什么是完全未指定的,并且不一定所有的位都是零

如果您的代码是您所说的,那么要么:您的平台确实将该值用作null,要么不使用该值而编译器已损坏,要么不使用该值而您读取的值不正确


无论如何,C++代码都很好,并且将代码> PoxTy//Cube >设置为null。无需再担心任何事情。

Null不一定是按位零。它的价值是由实现定义的


也就是说,这些都是一样的:

void* pointy = NULL;
void* pointy = 0;
void* pointy = nullptr;
它们将空指针值分配给
pointy
。这个值在位级别上是什么是完全未指定的,并且不一定所有的位都是零

如果您的代码是您所说的,那么要么:您的平台确实将该值用作null,要么不使用该值而编译器已损坏,要么不使用该值而您读取的值不正确


无论如何,C++代码都很好,并且将代码> PoxTy//Cube >设置为null。无需再担心任何事情。

当您执行包含以下内容的程序时:

void* pointy = NULL;
它初始化指针对象
pointy
,使其包含一个空指针值(假设您已经
#包含定义
null
宏的其中一个头)

空指针是给定指针类型的值,与该类型的任何其他值不同。从逻辑上讲,它是一个不指向任何东西的指针

空指针可以用一个空指针常量在C++源代码中表示。code>NULL

是一个扩展为NULL指针常量的宏。文字
0
也是一个空指针常量,关键字
nullptr
(最近添加到语言中)也是一个空指针常量。这并不一定意味着空指针值表示为所有位零,但它通常是零,我愿意打赌它在您的系统上

如果打印
pointy的值

std::cout << "pointy = " << pointy << "\n";
请注意,您不能取消对
pointy
的引用以确定它所指向的内容,因为它属于
void*
类型。如果它是其他指针类型,例如
int*
,那么您可以编写代码来取消对它的引用,但该代码的行为将是未定义的;最有可能的行为是程序崩溃,但一切皆有可能

至于你在调试器中看到了什么,如果没有更多的信息,我真的无法猜测。调试器可能工作不正常,但可能性不大。您可能正在查看pointy所指向的内容(可能在内存地址0处),但这也不太可能;由于
void*
指针不指向任何指定类型的数据,因此调试器无法显示它

是否您在
pointy
的定义处设置了一个断点,并在命中断点时查看其中存储的值?如果是这样,那么您可能只是在初始化发生之前看到了值。尝试向前走一行,然后再次查看值。如果这似乎在x86上正常工作,可能是因为在初始化之前包含的
pointy
垃圾看起来像空指针

在任何情况下,C++语言都不涉及使用调试器时会看到什么;它只定义程序执行时的行为。如果您在使用调试器时遇到问题,这是一个合理的问题,但您需要告诉我们您正在使用的调试器,以及您正在使用它做什么,并向我们展示一个显示问题的完整小程序

编辑:在对另一个答案的评论中,您写道

我希望“pointy”指向0

这至少意味着两件截然不同的事情

这:

使
ptr
指向内存中某处的对象;该对象包含
int
0
。您可以说“ptr指向0”,但更准确的说法是“ptr指向值为0的对象”

这:

导致
nptr
的值为空指针。这可能就是您所说的“指向0”的意思,但最好说
nptr
的值是空指针。(如果你将代码> NPTR < /C>作为机器级地址,它可能包含内存位置零点的地址;换句话说,代码> NPTR 指向内存位置0。但是在C++中,它并不真正指向ALL中的任何内存位置;空指针值是一个特殊的地址,类似于用来区分指针的值。不要指向指向对象的指针的任何位置。)

我认为,您真正想要的是
pointy
包含一个空指针值,您向我们展示的代码:

void* pointy = NULL;  // or 0, or nullptr

这正是正确的方法。

当您执行包含以下内容的程序时:

void* pointy = NULL;
它初始化指针对象
pointy
,使其包含一个空指针值(假设您已经
#包含定义
null
宏的其中一个头)

空指针是给定指针类型的值,与该类型的任何其他值不同。从逻辑上讲,它是一个不指向任何东西的指针

空指针可以用一个空指针常量在C++源代码中表示。code>NULL

是一个扩展为NULL指针常量的宏。文本
0
也是一个空指针常量,k也是
void* pointy = NULL;  // or 0, or nullptr