0

私はこのような機能を持っています:

uint8_t getULEB128Value(uint8_t *p, uint32_t *to){
    unsigned int result; 
    uint8_t count = 1;
    uint8_t cur;

    result = *p;
    if(result > 0x7F){
        count++;
        cur = *(++p);
        result = (result & 0x7F) | (cur << 7);
        if(cur > 0x7F){
            count++;
            cur = *(++p);
            result |= ((cur & 0x7F) << 14);
            if(cur > 0x7F){
                count++;
                cur = *(++p);
                result |= ((cur & 0x7F) << 21);
                if(cur > 0x7F){
                    count++;
                    cur = *(++p);
                    result |= ((cur & 0x7F) << 28);
                }
            }
        }
    }
    *to = result;
    return count;
}

今、私は長さを知りたいだけで、値にはあまり興味がありません...
ドントケアポインタを持つことは可能ですか?そこに書かれているすべての値はニルヴァーナに行きますか?/ dev / nullのように?
もちろん、どこかにポインタを作成して後で解放することもできますが、そのための何かがすでにあるのでしょうか。

4

3 に答える 3

2

これの通常のパターンは、関数にnullポインターを渡して、値を書き込む前にこれをチェックできるようにすることです。

if (to != NULL) {
  *to = result;
}

その後、あなたはそれを次のように呼ぶことができます

result = getULEB128Value(p, NULL);

「to」ポインタに何も書き込みたくない場合。

于 2012-10-09T09:16:52.607 に答える
2

Cでは、既存の有効なオブジェクトを指していないポインターを逆参照することは法的に許可されていません。

長さを見つけるには(私があなたの問題を正しく理解していれば)、これと同じくらい簡単なことをすることができます:

size_t GetLength(const uint8_t* p)
{
  size_t l = 1;
  while (*p & 0x80)
  {
    p++;
    l++;
  }
  return l;
}
于 2012-10-09T09:21:04.193 に答える
0

/ dev / nullの概念は、ストリームではないため、ポインターには適用されません。ポインターに複数のデータを書き込む場合、通常は値ごとにポインターをインクリメントするため、実際には、ポインターの後ろに最初の値を除くすべてを書き込みます。ポインタ演算は明確に定義されているため、「ドントケア」ポインタを持つことはできません。

于 2012-10-09T09:21:49.270 に答える