Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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++ c指针可以接受的值的范围?_C++_C_Pointers_System - Fatal编程技术网

C++ c指针可以接受的值的范围?

C++ c指针可以接受的值的范围?,c++,c,pointers,system,C++,C,Pointers,System,在“计算机系统:程序员的观点”第2.1节(第31页)中,它说: C中指针的值是某个存储块的第一个字节的虚拟地址 在我看来,C指针的值可以取值为0到[size of virtual memory-1]。是这样吗?如果是的话,我想知道是否有任何机制可以检查程序中的所有指针是否都被分配了合法的值——值至少为0,最多为[size of virtual memory-1],以及这种机制在编译器中的内置位置?操作系统?或者别的什么地方?C中的指针是一个抽象对象。C标准提供的唯一保证是指针可以指向它们在C中需

在“计算机系统:程序员的观点”第2.1节(第31页)中,它说:

C中指针的值是某个存储块的第一个字节的虚拟地址


在我看来,C指针的值可以取值为0到[size of virtual memory-1]。是这样吗?如果是的话,我想知道是否有任何机制可以检查程序中的所有指针是否都被分配了合法的值——值至少为0,最多为[size of virtual memory-1],以及这种机制在编译器中的内置位置?操作系统?或者别的什么地方?

C中的指针是一个抽象对象。C标准提供的唯一保证是指针可以指向它们在C中需要的所有东西:函数、对象、超过对象末尾的一个和NULL

在典型的C实现中,指针可以指向虚拟内存中的任何地址,一些C实现在很大程度上故意支持这一点。然而,也有一些复杂情况。例如,用于NULL的值可能难以用作地址,并且将为一种类型创建的指针转换为另一种类型可能会失败(由于对齐问题)。此外,还有一些非典型的合法C实现,其中指针不以正常方式与内存地址直接相关

您不应该期望在不了解C标准和您使用的C实现的规则的情况下,使用指针任意访问内存


C中没有检查程序中指针是否有效的机制。程序员负责正确使用它们。

没有检查指针有效性的过程,因为无效指针的使用具有未定义的效果

通常,指针不可能保持可寻址范围之外的值,因为这两个值具有相同的可用范围-例如,两个值都是32位。但是,某些CPU具有指针对齐规则,这可能导致某些地址对于某些类型的数据无效。有些运行时,例如64位Objective-C,它是C的严格超集,使用错误对齐的指针将文字对象伪装为堆上的对象

在某些情况下,完整的地址空间由指令集定义为一件事,但由特定硬件实现为另一件事。历史上的一个例子是最初的68000,它定义了一个32位空间,但只有24条地址线。Mac OS的早期版本使用备用8位作为描述数据块的标志,依靠硬件忽略它们

因此:

  • 没有运行时有效性检查
  • 即使有,有效性的含义通常取决于CPU的特定型号(不仅仅是系列)或操作系统的特定版本(同上),以便使检查任务比您可能想象的要简单

实际上,如果您的地址对于该硬件来说是非法的,但被访问时却好像合法的是处理器例外一样,通常会发生什么情况。

出于实际目的,C指针要么是空的,要么是指向其他对象的内存地址。在现实生活中,我从来没有听说过空是零。如果它是一个内存地址,你不应该“关心”实际数字是多少;只需传递它,取消引用它等等。

我认为这是由指针的大小确定的,在32位系统中,指针的大小是4字节,虚拟内存是2^32,所以它总是有效的?法律值是实现和操作系统特定的。要实现您所寻求的目标,需要一个系统,该系统确切地知道每个指针在您运行的代码中的位置。大多数分析器寻找有效的指针,因为字节序列是一个有效的内存偏移量),但很少有平台(我只能想到一个)能够真正知道存储在进程内存中特定位置的值是否是(a)指针,以及(b)是否持有有效地址。指针可以接受任何有效值。但“有效”在很多方面都是合格的。零是有效的,但1肯定不是。根据分配给进程的地址范围,某些范围有效,而其他范围无效。偶数地址可能有效,奇数地址可能无效,这取决于体系结构的细节。@WhozCraig-一些Java版本知道哪些特定位置是指针,哪些不是指针,但在C中这几乎是不可能的。@hotlick解决了这一难题,但如果在内核级别完成,这并非不可能。AS/400做到了这一点(我能想到的一个平台),如果说它是非凡的,那就低估了史诗般的比例。