在C,我宣佈一個存儲區是這樣的:如何判斷我在指針算術的數組中?
int cells = 512;
int* memory = (int*) malloc ((sizeof (int)) * cells);
我或多或少地將自己在中間
int* current_cell = memory + ((cells/2) * sizeof (int));
我的問題是,當我增加*current_cell
,我該怎麼辦知道我是否已到達分配的內存區域的末端?
在C,我宣佈一個存儲區是這樣的:如何判斷我在指針算術的數組中?
int cells = 512;
int* memory = (int*) malloc ((sizeof (int)) * cells);
我或多或少地將自己在中間
int* current_cell = memory + ((cells/2) * sizeof (int));
我的問題是,當我增加*current_cell
,我該怎麼辦知道我是否已到達分配的內存區域的末端?
if (current_cell >= memory + cells)
no_longer_in_valid_memory;
但是!你的代碼中有一個很大的問題。如果你想current_cell是某處的存儲區的中間附近,你應該真正做到這一點:
int* current_cell = memory + (cells/2);
指針運算會在的sizeof(int)的照顧倍增的。
當你的有效索引範圍內滿足以下條件:
memory <= current_cell && current_cell < memory + cells
,所以如果你只增加它足以檢查
current_cell < memory + cells
但要小心的地址 - 你可能會增加通過這樣一個bug值的地址溢出並且變得小於memory
。如果你確定溢出不能發生,只使用第二個簡化條件。
而且我把自己或多或少在中間
int* current_cell = memory + ((cells/2) * sizeof (int));
當然沒有。所述正確表達將是:
int* middle = memory + cells/2;
因爲指針運算取指針的類型考慮在內。換言之,此表達式:
memory + 1
不是由單一字節,而是由sizeof(int)
字節遞增指針。
陣列,其開始於memory
,相當於指針current
中的索引,只是current - memory
- 在「縮放」(由sizeof(int)
)被取爲你照顧。所以,你知道指針是有效的(即,在開始的memory
cells
- 長數組的範圍內),當且僅當指數爲>=0
和<cells
(從0到511包括,在你的例子):
((current - memory) >= 0) && ((current - memory) < cells)
你確定它不是cells * sizeof int嗎?這是我的疑問。 – 2010-04-05 14:44:11
@ klez:當然不會有'* sizeof()'。使用'type *'指針(類型+ N)指向第N個元素 - 編譯器將執行'* sizeof(Type)'乘法。 – sharptooth 2010-04-05 14:46:31
它不是。當您使用+或 - 與指針和整數類型時,它會添加或減去*元素*,而不是字節。 – 2010-04-05 14:47:02