0

スニペットのchar * ような タイプの 2 つのポインターを比較することはできますか? p<pkt+n許可されていない場合、この while 条件を置き換えるより良い方法はありますか?

      int n = 40;
      char *pkt = malloc(4);
       ...
      char *p;
      p=pkt;

      while(p<pkt+n){
           ...
           p+=4;
           ...
           p++;
           ..blabla
      }
4

3 に答える 3

3

はい、許可されています。4 バイトしか割り当てていないことに注意してください。ただし、40 バイトのループを繰り返します。

于 2013-06-12T22:54:20.393 に答える
3

両方のポインターが同じ "オブジェクト" (単一のメモリ割り当て、同じ構造体、または同じ配列など) を指している場合は許可されます。

コンパイラは通常、異なるオブジェクトへのポインターを比較できますが、結果が特定の意味を持つことは保証されていません。例えば、

char *x = malloc(10);
char *y = malloc(10);
if (y > x) { ... }

コンパイラーは (おそらく) if ステートメントの比較について文句を言うことはありませんが、特定の意味を持つことは保証されていません。ただし、ほとんどのプラットフォームでは、実際には期待どおりにアドレスが比較されます。

于 2013-06-12T22:56:36.980 に答える
0

元の条件は、比較に含まれるポインターが同じ配列の要素を指している限り、または配列の末尾を 1 ステップ超えた位置を指している限り有効です。同等の条件に置き換えることもできます

while (p - pkt < n)

後者のバリアントは、ポインターではなく整数を比較しますが、元のバリアントとまったく同じポインター プロパティに依存しています。言い換えれば、それは単なる個人的な好みの問題です。

于 2013-06-12T23:33:28.213 に答える