Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 0x000001、0x000002等是否曾经是应用程序级编程中的有效内存地址?_C++ - Fatal编程技术网

C++ 0x000001、0x000002等是否曾经是应用程序级编程中的有效内存地址?

C++ 0x000001、0x000002等是否曾经是应用程序级编程中的有效内存地址?,c++,C++,或者这些东西是为操作系统保留的吗 谢谢。操作系统将为每个程序提供自己的虚拟内存空间,因此当应用程序引用内存空间0x0000001或0x0000002时,它实际上引用了其他物理内存地址。我会看一看,然后。因此,程序将永远无法访问操作系统正在使用的内存。但是,我不会手动为指针分配内存地址,而不是使用malloc(),因为这些内存地址可能是文本或保留空间 这取决于操作系统布局。对于在通用操作系统中运行的用户空间应用程序,这些地址是不可访问的

或者这些东西是为操作系统保留的吗


谢谢。

操作系统将为每个程序提供自己的虚拟内存空间,因此当应用程序引用内存空间0x0000001或0x0000002时,它实际上引用了其他物理内存地址。我会看一看,然后。因此,程序将永远无法访问操作系统正在使用的内存。但是,我不会手动为指针分配内存地址,而不是使用
malloc()
,因为这些内存地址可能是文本或保留空间

这取决于操作系统布局。对于在通用操作系统中运行的用户空间应用程序,这些地址是不可访问的虽然0x00000001等不太可能是有效指针(特别是在许多处理器上使用奇数时),但使用指针存储整数值将高度依赖于系统

你真的那么紧张吗

编辑:

您可以让它像这样便于携带:

char *base = malloc(NUM_MAGIC_VALUES);
#define MAGIC_VALUE_1 (base + 0)
#define MAGIC_VALUE_2 (base + 1)
...

这个问题与体系结构的虚拟地址空间有关。在此获得战利品当然,您可以这样做:

int* myPointer1 = 0x000001;
int* myPointer2 = 0x000032;
但不要尝试取消对地址的引用,因为这样会导致访问冲突。 操作系统提供内存,顺便说一下,这些地址只是虚拟的 操作系统隐藏了细节,并将其显示为一条连续的大条纹

可能0x000000-0x211501部件位于Web服务器上,您可以通过网络进行读/写,
剩下的在你的硬盘上。从您当前的观点来看,物理内存只是一种幻觉。

它取决于编译器/平台,但许多较旧的编译器实际上在地址0x00000000处有类似字符串“(null)”的内容。这是一个调试特性,因为如果意外使用空指针,该字符串将显示。在Windows等较新系统上,指向此区域的指针很可能会导致处理器异常

我几乎可以保证地址1和地址2将被使用,或者如果它们被使用过,将引发处理器异常。您可以将任何喜欢的值存储在指针中。但是如果你试图用一个随机值去引用一个指针,你肯定是在问问题


换一个漂亮的整数怎么样?

尽管标准要求NULL为0,但NULL指针不必包含所有零位,尽管在许多实现中都可以。如果您memset了一个包含一些指针的POD结构,然后依赖于将“NULL”作为其值的指针,那么您也必须注意这一点

如果你想使用与指针相同的空间,你可以使用一个并集,但我想你真正想要的是一个可以同时用作指针和其他东西的东西,如果它包含低编号的值,你知道它不是指向实际地址的指针。(对于工会,您仍然需要知道您拥有哪种类型的工会)


我很想知道神奇的另一个价值观到底是用来做什么的。这是一个懒惰的评估问题,指针指示如何在数据尚未加载时加载数据,而真正的指针则指示如何加载数据?

是的,在某些平台上,地址0x00000001和0x00000002是有效的地址。在其他平台上,情况并非如此

在嵌入式系统世界中,有效性取决于驻留在这些位置的内容。一些平台可能会在这些地址上放置中断或重置向量。其他嵌入式平台可能会在其中放置位置无关的可执行代码

地址布局没有标准规范。我们不能假设任何事情。如果你希望你的代码是可移植的,那么忘记访问特定的地址,把它留给操作系统


此外,指针的结构取决于平台。指针中的值到物理地址的转换也是如此。一些系统可能只解码指针的一部分,其他系统使用整个指针值。有些可能使用间接寻址(又称虚拟寻址)来访问真实对象。这里仍然没有标准化。

如果指针“未使用”,我想使用指针来存储一些非常小的整数。@Mike:常规整数有什么问题吗?这个想法听起来很错误。如果它是指针,则仅将其用作指针。这就像你散步时在走廊里埋了一颗地雷,“因为走廊没人用”;)好吧,伙计,听着,在这个项目中我总是去朋克摇滚,这很难。如果这些地址不能在正常程序执行期间出现,我会很好。这就是为什么我要问这个问题。毕竟,苹果在最初的Mac操作系统中使用了指针的前8位来表示特殊的东西。一定没问题。;-)我不想取消对指针的引用。他想在指针中保存“魔法”值。@Richard,是的,因为这些地址通常无法从用户模式访问,所以他可以将这些地址用作特殊标记。然而,偶然的引用可能会引起严重的担忧(类似于宇宙膨胀和收缩到大爆炸)。是的,我是。我考虑了可移植性问题。它是依赖于处理器还是依赖于操作系统?它很可能会工作。但你不能保证。它绝对不是便携式的。@Mike Shinola:可能两者都有。从严格的可移植性角度来看,您无法真正保证它始终有效。然而,从纯实用的角度来看,只要你不去引用指针,它就应该工作。这是一个非常好的主意!感谢您的回答。具体来说,标准保证空指针与任何指向对象的指针相比都不相等。然而,它并没有这样做