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

通常的模式是允许将空指针传递给您的函数并在写入值之前检查它:

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 回答