2014-03-25 161 views
0

我正在爲C中的mallocfree編寫我自己的函數,用於指派。我需要利用包裝函數C sbrk()。根據我的理解,sbrk()將程序的數據空間增加了作爲參數傳遞的字節數,並指向程序中斷的位置。投射指向int的指針

如果我有下面的代碼片段:

#define BLOCK_SIZE 20

int x;

x = (int)sbrk(BLOCK_SIZE + 4);

我得到的編譯器錯誤warning: cast from pointer to integer of different size。爲什麼是這樣,無論如何,我可以將sbrk()指向的地址投射到int

+3

是否有任何理由不使用'void * x;'?如果你真的想要一個整型,intptr_t x =(intptr_t)sbrk ...;'from'' –

+0

因爲int是32位,所以指針是64位。嘗試使用long int。嘗試檢查sizeof(int)和sizeof(void *) –

回答

2

我得到編譯器錯誤警告:從指針強制轉換爲不同大小的整數。
這是爲什麼

由於指針和int可以具有不同的長度,例如,在64位的系統,sizeof(void *)(即指針的長度)通常爲8,但sizeof(int)通常是4。在這種情況下,如果您將一個指針指向int並將其轉換回來,您將得到一個無效指針而不是原始指針。

有無論如何我可以將sbrk()指向的地址轉換爲int嗎?

如果你真的需要一個指針轉換爲整數,則應該將其轉換爲intptr_tuintptr_t,從<stdint.h>


<stdint.h>(P)

  • 能夠保持對象指針

以下類型表示具有任何有效的指針的孔隙可以是屬性帶符號的整數類型整數類型轉換爲此類型,然後轉換回指向void的指針,並將結果與​​原始指針進行比較:intptr_t

以下類型表示具有任何有效的指針的孔隙可以被轉換爲這種類型的屬性的無符號整數類型,則轉換回指向void,結果將比較等於原始指針:uintptr_t

在符合XSI標準的系統上,需要intptr_tuintptr_t類型;否則,它們是可選的。

+0

我試着將它轉換爲一個'intptr_t'並編譯它。我試圖將其轉換爲int的原因是,我可以看到堆中是否還有剩餘空間。如果在我上面的代碼片段中,x小於0,那麼堆中沒有更多空間。 – user3268401