aio*_*obe 16 c c++ null memory-management
我理解NULLC/C++中常量的用途,我理解它需要在内部以某种方式表示.
我的问题是:对于C/C++中的对象,0地址是否是无效的内存位置有一些根本原因吗?或者我们理论上是因为这次预订而"浪费"一个字节的内存?
bob*_*vil 21
空指针实际上不必是0.在C规范中保证当在指针的上下文中给出常量0值时,编译器将其视为null,但是如果你这样做的话
char *foo = (void *)1;
--foo;
// do something with foo
Run Code Online (Sandbox Code Playgroud)
您将访问0地址,不一定是空指针.在大多数情况下,实际情况确实如此,但这不是必要的,所以我们不必浪费那个字节.虽然在较大的图片中,如果它不是0,它必须是某种东西,所以在某处浪费了一个字节
编辑:由于注释中的混淆,编辑出使用NULL.此外,这里的主要消息是"空指针!= 0,这里是一些C /伪代码,显示了我正在努力做的事情." 请不要尝试编译这个或担心类型是否合适; 意思很清楚.
Uri*_*Uri 11
这与浪费内存无关,而与内存组织有关.
当您使用内存空间时,您必须假设任何不直接"归属于您"的内容都由整个系统共享或非法访问.如果您已经在堆栈上的某些内容的地址仍然在堆栈上,或者您已从动态内存分配器接收到并且尚未回收它,则地址"属于您".一些操作系统调用也将为您提供法律区域.
在实际模式(例如,DOS)的美好时代,机器地址空间的所有开头都不是由用户程序编写的.其中一些甚至映射到I/O之类的东西.例如,写入0xB800(相当低)的地址空间实际上会让你捕获屏幕!在地址0处没有放置任何东西,并且许多内存控制器不允许您访问它,因此它是NULL的绝佳选择.事实上,如果你尝试在那里写一些电脑上的内存控制器就会疯狂.
今天,操作系统通过虚拟地址空间保护您.但是,不允许任何进程访问未分配给它的地址.大多数地址甚至没有映射到实际的内存页面,因此访问它们将触发一般保护错误或操作系统中的等效操作.这就是为什么0不浪费 - 即使您机器上的所有进程"都有一个地址0",如果他们试图访问它,它也不会映射到任何地方.
There is no requirement that a null pointer be equal to the 0-address, it's just that most compilers implement it this way. It is perfectly possible to implement a null pointer by storing some other value and in fact some systems do this. The C99 specification §6.3.2.3 (Pointers) specifies only that an integer constant expression with the value 0 is a null pointer constant, but it does not say that a null pointer when converted to an integer has value 0.
An integer constant expression with the value 0, or such an expression cast to type void*, is called a null pointer constant.
Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.
On some embedded systems the zero memory address is used for something addressable.
零地址和NULL指针不是(必然)相同的东西.只有文字零是空指针.换一种说法:
char* p = 0; // p is a null pointer
char* q = 1;
q--; // q is NOT necessarily a null pointer
Run Code Online (Sandbox Code Playgroud)
系统可以以他们选择的任何方式在内部自由地表示空指针,并且这种表示可以通过使实际的0地址非法来"浪费"一个字节的存储器.但是,需要编译器将文字零指针转换为系统的NULL内部表示形式.除了被赋予文字零之外,通过某种方式指向零地址的指针不一定是空的.
现在,大多数系统都使用0表示NULL,但它们不必.
它不一定是非法的内存位置.我通过解除引用零指针来存储数据......它发生的数据是一个中断向量,存储在位于零地址的向量处.
按照惯例,它通常不被应用程序代码使用,因为历史上许多系统具有从零开始的重要系统信息.它可能是引导ROM或向量表,甚至是未使用的地址空间.
在许多处理器上,零地址是重置向量,其中包含 bootrom(PC 上的 BIOS),因此您不太可能在该物理地址上存储任何内容。在具有 MMU 和支持 OS 的处理器上,物理地址和逻辑地址不必相同,并且地址零在执行进程上下文中可能不是有效的逻辑地址。
| 归档时间: |
|
| 查看次数: |
7464 次 |
| 最近记录: |