2013-07-02 63 views
0

這是一個家庭作業問題,我很困惑如何處理。如果我不能使用/,%或任何循環,還有一些限制。給定一個方法,它接受兩個int類型的指針。考慮到這兩個指針,我需要找出它們是在同一塊內存還是在不同的內存塊中。如果情況一,我返回1爲他們在同一個塊中,否則爲0。所以我的想法是,如果兩個指針位於相同的內存塊中,這意味着它們指向相同的整數?林不知道這是否正確任何暗示正確的方向將不勝感激。檢查兩個指針​​是否在同一塊內存中

謝謝

+6

這取決於「同一塊內存」是什麼意思分配給你的。 –

+3

相同的塊通常意味着「它們指向相同的內存給予或需要幾個kB」。這意味着地址的最高位是相同的 - 最低位將不同。如果你知道塊有多大,你就知道有多少位應該是相同的。足夠的提示? – Floris

+0

你瞭解位掩碼的工作原理嗎? '0x123456&0xFFFF00 = 0x123400';但'0x123465&0xFFFF00 = 0x123400'以及... – Floris

回答

2

弗洛里斯基本上給了你這個想法;這是我對POSIX的實際實現:

uintptr_t pagesz = getpagesize(); 
uintptr_t addr_one = (uintptr_t)ptr1; 
uintptr_t addr_two = (uintptr_t)ptr2; 

bool in_same_page = (addr_one & ~(pagesz - 1)) == (addr_two & ~(pagesz - 1)); 
+1

對於POSIX - *來說,這是有道理的*假設*從指針到'uintptr_t'的轉換在某種意義上表現良好。一般來說C對它無效;沒有未定義的行爲,但結果不能保證(通過C標準)完全有意義。 –

+1

你不是至少有一個?如果你想要設置所有的最高位,你需要'〜(pagesz-1)'。無論如何,我想作業我會離開OP一點點的工作,這就是爲什麼我寫評論提示,而不是完整的解決方案。嘶嘶聲! – Floris

+0

@弗洛伊斯正確,我忘了減法。 – 2013-07-03 06:53:08

-2

假設你知道的存儲器塊有多大(I假定1K(2^10)),則可以從較大減去較小的地址,看看差小於所述塊大小-1。

int same_block(int x, int y){ 

    int difference; 

    if(x > y){ 
     difference = x - y; 
    } else { 
     difference = y - x; 
    } 

    if(difference < 1024){ 
     return 1; 
    } 

    return 0; 

} 
+0

這是錯誤的,如果一個地址是1000,另一個是1500,這將產生真實的結果, t駐留在同一個塊中。 – 2013-07-02 19:38:35

相關問題