C 使用指针到指针函数参数(由库API提供)从函数中检索值

C 使用指针到指针函数参数(由库API提供)从函数中检索值,c,function-pointers,protocol-buffers,C,Function Pointers,Protocol Buffers,我现在指的是下面的例子 我对函数进行了如下修改-因为我不想使用'**arg'将值传递给函数,而是想使用'**arg'检索函数中获得的值。 bool print_int32(pb_istream_t *stream, const pb_field_t *field, void **arg) { uint64_t value; if (!pb_decode_varint(stream, &value)) return false; *arg = (v

我现在指的是下面的例子

我对函数进行了如下修改-因为我不想使用'**arg'将值传递给函数,而是想使用'**arg'检索函数中获得的值。

bool print_int32(pb_istream_t *stream, const pb_field_t *field, void **arg)
{
    uint64_t value;
    if (!pb_decode_varint(stream, &value))
    return false;
        *arg = (void*) value; // This is 42

    printf("The value = %ld, *arg = %ld, arg = %ld\n", (long)value, (long)*arg, (long)arg); 
    return true;
}
(long)*arg
现在是42,并且
(long)arg
保存另一个值,例如“-1234567890”。 现在,在main函数中,我对代码做了如下更改

testmessage.submsg.int32value.funcs.decode = &print_int32;
long int32_dec = (long) &testmessage.submsg.int32value.arg; 
//long int32_dec = *(long*) testmessage.submsg.int32value.arg; //This seems to makes no difference
//long int32_dec = (long) testmessage.submsg.int32value.arg; //This seems to makes no difference
int32_dec
值与我在(long)arg中看到的值相同(在我们的示例'-1234567890')。这不是我想要的。相反,我想得到42(在我们的示例中),代码中是否有什么东西需要更改才能得到42(在我们的示例中)

更新[已解决] 感谢jpa确认了我的指针概念和语法(有一刻我觉得我疯了)。核心问题是我明显愚蠢地错误地放置了代码片段

//This is wrong
long int32_dec = (long) testmessage.submsg.int32value.arg;
if (!pb_decode(&stream, TestMessage_fields, &testmessage))
    return 1;
原因是它得到了一个与42不同的解码例程没有更新的值(在我们的示例中)


您只有一个
&
符号太多。 这应该起作用:

long int32_dec = (long)testmessage.submsg.int32value.arg;

arg
视为一个自由字段,您可以使用它传递任何内容,就像您正在做的那样。为了在回调中写入它,您需要像现在这样使用
*arg
。但是,在回调之外,您可以直接读取它,而无需
&
*

您是否意识到(长)arg存储了arg的地址?是的。我愿意。也许我应该把它打印成%p和arg,而不是(长)arg。我对指针指针有点生疏,在C++中使用了很多引用。在这个例子中,我必须使用这个库API。我只需要看到address的值。我知道这一点,并且已经从您的解决方案中获得了这段代码,但它不起作用,它知道应该起作用(现在我证明我的概念至少在这一部分没有错),直到今天我发现我的愚蠢错误,它才起作用。我把这句话放错地方了。这应该在实际的“解码”例程之后(而不是之前)出现,否则它会在解码之前给我该位置的值,在我的例子中,该位置显然不是“42”(在我们的示例中)。该死的!
long int32_dec = (long)testmessage.submsg.int32value.arg;