比较两个指针时">="运算符的奇怪行为

Weird behavior of ">=" operator when comparing two pointers

本文关键字:运算符 gt 两个 指针 比较      更新时间:2023-10-16

我正在尝试使用">="运算符比较两个指针的数值,但它没有比较它们,而是在第一个指针中添加了一些随机值。

void obj::Loader::calculate_size(const char* start_ptr, const char* end_ptr, atomic_long& v, atomic_long& vt, atomic_long& vn, atomic_long& f) {
while (start_ptr >= end_ptr) {
if (*start_ptr == 'v') {
start_ptr++;
if (*start_ptr == ' ') {
v++;
start_ptr += 27;
}
else if (*start_ptr == 't') {
vt++;
start_ptr += 18;
}
else if (*start_ptr == 'n') {
vn++;
start_ptr += 21;
}
}
else if (*start_ptr == 'f') {
start_ptr++;
if (*start_ptr == ' ') {
f += 3;
start_ptr += 17;
}
}
start_ptr++;
}
}

此函数应该在内存映射文件的一部分(从"start_ptr"到"end_ptr"(中计算这些字母的所有实例。知道文件某些部分的最小长度后,我决定有时将"start_ptr"增加不止一个,但这样做我不能依靠"!="运算符来停止循环。

问题是">="并没有像在整数上那样真正工作,它只会使整个事情崩溃。还有其他选择吗?

给定循环条件是start_ptr >= end_ptr,并且考虑到循环体只会递增start_ptr,如果循环被进入,那么start_ptr永远不会小于end_ptr,因此循环是无限的。程序的行为是未定义的。

"开始"在结束之后是相当不寻常的,所以我怀疑这是逻辑上的错误。

对我来说,这种比较似乎是错误的:而不是

while (start_ptr >= end_ptr) {
// [...]
start_ptr++;
}

我希望自然条件是:

while (start_ptr < end_ptr) {
// [...]
start_ptr++;
}

我怀疑程序中的崩溃不是直接由于指针比较造成的,而是未进入循环时发生意外情况的副作用。