c - significance of (void*) -1



我在查看sbrk系统调用的文档时发现:

成功后,sbrk()返回上一个程序中断。(如果中断增加,则此值是指向新分配的内存开始的指针)。出现错误时,返回(void *) -1,并将errno设置为ENOMEM

现在,

  1. (void *) -1的意义是什么?

  2. 它指向的确切内存地址是什么?(如果有)

  3. 如何保证(void *) -1不是有效地址成功后sbrk()可以返回的?

(void *) -1 == (size_t) -1

在32位机器上是0xFFFFFFFF,在64位机器上则是0xFFFFFFFFFFFFFFFF,这是一个无效的地址,应该比任何其他地址都大。

  1. (void *) -1的意义是什么

这只是一个哨兵值,sbrk()在成功的情况下无法返回。

  1. 它指向的确切内存地址是什么?(如果有的话)

它不应该是一个有效的地址,而且特定的值也不相关。

  1. 如何保证(void *) -1不是sbrk()成功返回的有效地址

这可能看起来像是循环推理,但它是有保证的,因为sbrk()将其作为合同的一部分进行保证。(例如,如果成功,sbrk()可以检查是否会返回该值;如果是,则它什么也不做并报告失败。)

在实践中,大多数现代机器上的(void*) -1将是0xFF...FF,这将是尽可能高的地址,而这只是不太可能有效的东西。

相关内容

最新更新