2017-03-07 29 views
-1

我給分配代碼是Ç - SBRK(大小)返回有效的指針但SBRK(0)是負值

dat* data = NULL; 
data = sbrk(SIZE); 
if((int) data != -1){ 
    return data 
}else{ 
    printf("Not enough space"); 
} 

的SBRK(...)函數返回一個有效的ADRESS(0x603021),但是當我進入gdb和打印sbrk(0)我得到十六進制值0xffffffff8060341。做完數學計算後,我發現指針0x8060341應該是sbrk(0)。前面的字母f(即0xfffff ...)來自哪裏?

+0

你能向我們展示*你究竟做了什麼?你究竟得到了你所問的價值? –

+0

更確切地說,你是如何獲得值「0xffffffff8060341」?看起來你可能在某個地方涉及到簽名擴展。你有沒有其他奇怪的「(int)」在某處投射?您目前發佈的代碼中的代碼在64位arch上無疑是無效的。 – Dolda2000

+0

另外,你有沒有適當地包含'unistd.h'和/或編譯警告?你的問題可能是由於'sbrk'作爲int(*)(int)'隱式聲明造成的。 – Dolda2000

回答

1

gdb向您顯示內存段的完整64位地址。十六進制的64位地址需要16個總十六進制數字(0-9,A-F)才能完全指定。從64位/ 4位/位數= 16.

如果您看到的數量較少,這是因爲編輯器正在截斷存儲器地址的前32位(8位十六進制數字),並且只顯示剩餘的或更低的8位。這是來自32位計算世界的宿醉,其中8位十六進制數字足以完全指定存儲器地址。

+0

但是對於sbrk(0),地址應該是0x000000008060341而不是0xffffffff8060341 – BryG

+0

sbrk(0)是否返回-1作爲錯誤指示符?在sbrk(0)之前是否已經調用過brk(..)? – JimmyNJ

+0

brk(..)永遠不會在程序中調用 – BryG