【发布时间】:2020-06-20 09:41:37
【问题描述】:
sbrk() 的 Linux Man Page 声明失败时返回 (void*) -1。什么是(void*) -1,它有什么意义吗?或者它只是一个实际上不可能是void* 的数字,它被转换为void*,只是为了满足返回void* 的函数签名?我问这个是因为我以前从未见过指向负地址的指针。我不知道这可以在任何平台上取消引用。
【问题讨论】:
sbrk() 的 Linux Man Page 声明失败时返回 (void*) -1。什么是(void*) -1,它有什么意义吗?或者它只是一个实际上不可能是void* 的数字,它被转换为void*,只是为了满足返回void* 的函数签名?我问这个是因为我以前从未见过指向负地址的指针。我不知道这可以在任何平台上取消引用。
【问题讨论】:
正如您所猜想的,这只是一种返回神奇值-1 的方法。它被强制转换为一个指针,只是为了匹配函数签名。调用者将知道如何解释这个神奇的值,而不是试图取消引用它。
在内部,这实际上只是变为0xFFFFFFFFFFFFFFFF(或0xFFFFFFFF 用于32 位)。 可能有平台可以实际访问此地址,但这不是这里的目的。
【讨论】:
在大多数操作系统中,内存是在一组页面中分配的(这些页面可以在物理 RAM 中,也可以是存储在永久存储磁盘/设备上的虚拟页面,每个页面通常为 4KB)。由于 -1(无符号 0xFFFFFFFFFFFFFFFF 或 0xFFFFFFFF 用于 32 位)是 QWORD(或 32 位 DWORD)的最大可能值,因此页面通常不能从该地址开始,因为它是地址空间中的最后一个地址。因此,-1 是一个很好的值来指示内存分配中的错误,因为它通常被认为是不存在的页面。至于指向负地址的指针,如果您曾经有过汇编经验,您的编译器负责在其代码生成中强制执行符号,您会记得一个变量没有隐含的符号(只有指令给它这个属性)。当您在汇编中访问内存区域时,地址被认为是无符号数。
【讨论】: