2010-04-05 33 views
4

在C,我宣佈一個存儲區是這樣的:如何判斷我在指針算術的數組中?

int cells = 512; 
int* memory = (int*) malloc ((sizeof (int)) * cells); 

我或多或少地將自己在中間

int* current_cell = memory + ((cells/2) * sizeof (int)); 

我的問題是,當我增加*current_cell,我該怎麼辦知道我是否已到達分配的內存區域的末端?

回答

6
if (current_cell >= memory + cells) 
    no_longer_in_valid_memory; 

但是!你的代碼中有一個很大的問題。如果你想current_cell是某處的存儲區的中間附近,你應該真正做到這一點:

int* current_cell = memory + (cells/2); 

指針運算會在的sizeof(int)的照顧倍增的。

3

當你的有效索引範圍內滿足以下條件:

memory <= current_cell && current_cell < memory + cells 

,所以如果你只增加它足以檢查

current_cell < memory + cells 

但要小心的地址 - 你可能會增加通過這樣一個bug值的地址溢出並且變得小於memory。如果你確定溢出不能發生,只使用第二個簡化條件。

+0

你確定它不是cells * sizeof int嗎?這是我的疑問。 – 2010-04-05 14:44:11

+1

@ klez:當然不會有'* sizeof()'。使用'type *'指針(類型+ N)指向第N個元素 - 編譯器將執行'* sizeof(Type)'乘法。 – sharptooth 2010-04-05 14:46:31

+0

它不是。當您使用+或 - 與指針和整數類型時,它會添加或減去*元素*,而不是字節。 – 2010-04-05 14:47:02

1

而且我把自己或多或少在中間

int* current_cell = memory + ((cells/2) * sizeof (int)); 

當然沒有。所述正確表達將是:

int* middle = memory + cells/2; 

因爲指針運算取指針的類型考慮在內。換言之,此表達式:

memory + 1 

不是由單一字節,而是由sizeof(int)字節遞增指針。

1

陣列,其開始於memory,相當於指針current中的索引,只是current - memory - 在「縮放」(由sizeof(int))被取爲你照顧。所以,你知道指針是有效的(即,在開始的memorycells - 長數組的範圍內),當且僅當指數爲>=0<cells(從0到511包括,在你的例子):

((current - memory) >= 0) && ((current - memory) < cells)