意义

2016-07-24 80 views
5

我看着sbrk系统调用的文件,发现this意义

成功时,sbrk()返回先前的节目间断。 (如果中断增加了,那么这个值是一个指向新分配内存开始的指针)。出错时,返回(void *) -1errno设置为ENOMEM

现在,

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

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

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

回答

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

0xFFFFFFFF 32位计算机上和0xFFFFFFFFFFFFFFFF 64位机器上,即应该是比任何其它地址更大的地址无效。

+0

对不起,如果我听起来完全noob,但'(void *)-1'如何等于'0xFFFFFFFF' – tomol

+3

@tomol,在[2s补码](https://www.cs。cornell.edu/~tomf/notes/cps104/twoscomp.html) – Matt

+3

@tomol,想想它在另一个方向上,'0xFFFFFFFF + 1'多少钱?它是'0'!...一旦变量因比特限制而溢出,可能会发生有趣的事情;-) – Myst

2
  1. (void *) -1是什么意思?

它只是一个定点值sbrk()将不能在一个成功的案例返回的。

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

它不是一个有效的地址,具体的值是不相关的。

  • 它是如何保证(void *) -1不是可以通过sbrk()上成功返回一个有效的地址?
  • 它也许看起来循环推理,但它保证,因为sbrk()保证它作为合同的一部分。 (例如,sbrk()可以检查它是否返回值,如果成功;如果是这样,它不是无能为力,并报告故障)

    在实践中,(void*) -1上最现代化的机器将是0xFF...FF,这将是最高可能的地址,这是不太可能有效的。

    +1

    此外,即使“0xFF..FF”是一个有效的地址,只要系统具有sbrk系统调用,这是内核空间中的一个地址,在用户模式下不可访问。技术上'sbrk'可以将内核空间中的任何*地址返回给用户模式代码以指示错误。 – datenwolf