我在查看sbrk
系统调用的文档时发现:
成功后,
sbrk()
返回上一个程序中断。(如果中断增加,则此值是指向新分配的内存开始的指针)。出现错误时,返回(void *) -1
,并将errno
设置为ENOMEM
。
现在,
-
(void *) -1
的意义是什么? -
它指向的确切内存地址是什么?(如果有)
-
如何保证
(void *) -1
不是有效地址成功后sbrk()
可以返回的?
(void *) -1 == (size_t) -1
在32位机器上是0xFFFFFFFF
,在64位机器上则是0xFFFFFFFFFFFFFFFF
,这是一个无效的地址,应该比任何其他地址都大。
(void *) -1
的意义是什么
这只是一个哨兵值,sbrk()
在成功的情况下无法返回。
- 它指向的确切内存地址是什么?(如果有的话)
它不应该是一个有效的地址,而且特定的值也不相关。
- 如何保证
(void *) -1
不是sbrk()
成功返回的有效地址
这可能看起来像是循环推理,但它是有保证的,因为sbrk()
将其作为合同的一部分进行保证。(例如,如果成功,sbrk()
可以检查是否会返回该值;如果是,则它什么也不做并报告失败。)
在实践中,大多数现代机器上的(void*) -1
将是0xFF...FF
,这将是尽可能高的地址,而这只是不太可能有效的东西。