比较两个指针时“> =”运算符的怪异行为

时间:2019-09-20 02:33:01

标签: c++ pointers if-statement

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

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”增加一个以上,但是这样做不能依靠“!=“运算符来停止循环。

问题是“> =”并不能像整数一样真正起作用,只会使整个事情崩溃。有其他选择吗?

2 个答案:

答案 0 :(得分:2)

鉴于循环条件为start_ptr >= end_ptr,并考虑到循环主体仅递增start_ptr,如果曾经循环,则start_ptr永远不会小于{{ 1}},因此循环是无限的。该程序的行为是不确定的。

“开始”在结束之后是相当不常规的,因此我怀疑这是逻辑上的错误。

答案 1 :(得分:1)

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

const includedStates = ['NJ', 'NY'];

const withMap = () => includedStates.reduce((result, item) => ({
    ...result,
    [item]: {
      fill: 'red',
      clickHandler: (event) => console.log(event.target.dataset.name)
    }
  }), {});

console.log('withMap =>', withMap());

我希望自然条件是

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

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