在C中,我已经声明了这样的内存区域:
int cells = 512;
int* memory = (int*) malloc ((sizeof (int)) * cells);
我或多或少地把自己放在中间
int* current_cell = memory + ((cells / 2) * sizeof (int));
我的问题是,当我增加*current_cell
时,我怎么知道我是否到达了分配的内存区域的末尾?
答案 0 :(得分:6)
if (current_cell >= memory + cells)
no_longer_in_valid_memory;
然而!您的代码中存在大问题。如果您希望current_cell位于内存区域中间附近,您应该实际执行此操作:
int* current_cell = memory + (cells / 2);
指针算术将处理乘以sizeof(int)。
答案 1 :(得分:3)
当你在有效指数范围内时,以下情况属实:
memory <= current_cell && current_cell < memory + cells
所以如果你只增加地址就足以检查
了current_cell < memory + cells
但请注意 - 您可能会将地址增加一个错误值,使其溢出并变得小于memory
。如果你确定不会发生溢出,只能使用第二个简化条件。
答案 2 :(得分:1)
我或多或少地把自己放在中间
int* current_cell = memory + ((cells / 2) * sizeof (int));
实际上,没有。 正确表达式为:
int* middle = memory + cells / 2;
因为指针算法会考虑指针的类型。换句话说,这个表达式:
memory + 1
指针不是增加一个字节,而是增加sizeof(int)
个字节。
答案 3 :(得分:1)
数组中的索引(从memory
开始,相当于指针current
)只是current - memory
- “缩放”(sizeof(int)
)是照顾你。所以,你知道指针是有效的(即,在cells
- 从memory
开始的长数组的范围内)当且仅当索引是>=0
和<cells
时(在您的示例中包括0到511):
((current - memory) >= 0) && ((current - memory) < cells)