使用相同的指针询问下一个值

时间:2016-10-21 12:01:27

标签: c arrays pointers struct

我正在迭代这样的结构数组:

typedef struct{
  dword_t       BaseAddrLow ;   //Low 32 Bits of Base Address
  dword_t       BaseAddrHigh ;  //High 32 Bits of Base Address
  dword_t       LengthLow ;     //Low 32 Bits of Length in Bytes
  dword_t       LengthHigh ;    //High 32 Bits of Length in Bytes
  dword_t       Type ;          //Address type of  this range.
} descBloque_t ;

检查内存是否有重叠。所以我已经通过了我的数组的开始地址和函数的条目数。

int checOverlaps(descBloque_t * descBloque, int numBloques){

dword_t carry;
int i = 0, flag = 0;
ptrDescBloque_t ptrDescBloque = (ptrDescBloque_t)descBloque;
do{
    ptrDescBloque++;
    carry = 0;

    if(descBloque->BaseAddrLow + descBloque->LengthLow > ++descBloque->BaseAddrLow){
        flag = 1;
        printStrBIOS("\n\There is overlaps.");
        break;
    }
    else{
        i++;
        descBloque++;
    }

} while(i < numBloques);

return flag;
}

所以,我试过这样做:

if(descBloque->BaseAddrLow + descBloque->LengthLow > descBloque++->BaseAddrLow)
    //THERE IS OVERLAPS!! :(

但是,当您执行以下操作时,似乎就像在数组中一样

if(array[i] < array[i+1])
    //DO SOMETHING

或者有可能,我不知道如何正确地做到这一点?我的实际解决方案是创建一个辅助指针,它位于前方的一个位置,但我认为它可以没有辅助指针。

EDIT1:在if语句中,我询问的是SAME指针descBloque,但位于不同的位置。遗憾。

EDIT2:我也尝试过这个if语句,但它不起作用。

if(descBloque->BaseAddrLow + descBloque->LengthLow > ++descBloque->BaseAddrLow)

EDIT3:我已根据Michael Walz用户的请求添加了该功能的代码。

1 个答案:

答案 0 :(得分:2)

当使用 postfix 增量时:操作数descBloque++->BaseAddrLow返回前一个数组元素的BaseAddrLow,但会增加descBloque的值,所以它现在指向下一个要素。这个更新的指针实际上用在等式descBloque->BaseAddrLow + descBloque->LengthLow的左侧。

当使用前缀增量时:字段BaseAddrLow的值实际上是递增的,因为前缀增量的优先级低于成员选择(请参阅http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm)。

所以在这两种情况下你都没有得到你想要的东西。您需要执行以下操作:

if(descBloque->BaseAddrLow + descBloque->LengthLow > (descBloque + 1)->BaseAddrLow)
    //THERE IS OVERLAPS!! :(