我有这样的功能:
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?
我的意思是我当然可以在某个地方创建一个指针并在之后释放它但是也许已经有了它的东西?
答案 0 :(得分:2)
通常的模式是允许将空指针传递给你的函数并在写入值之前检查它:
if (to != NULL) {
*to = result;
}
然后您可以将其称为
result = getULEB128Value(p, NULL);
当你不想在“to”指针中写任何东西时。
答案 1 :(得分:2)
在C中,法律上不允许取消引用不指向现有有效对象的指针。
要找到长度(如果我正确理解你的问题),你可以做一些简单的事情:
size_t GetLength(const uint8_t* p)
{
size_t l = 1;
while (*p & 0x80)
{
p++;
l++;
}
return l;
}
答案 2 :(得分:0)
/ dev / null的概念不适用于指针,因为它不是流。如果向指针写入多个数据,通常会为每个值增加指针,因此实际上除了指针后面的第一个值之外都会写入。因为指针aritmetics是明确定义的,所以不可能有“不关心”指针。