意義

2016-07-24 57 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