我有以下代码,我想返回'out'的值并将其打印到文件中。我如何返回'out'的值而不是位置。此外,我如何从主函数调用函数uint32_pack ?谢谢你的帮助。
#if HAVE_PROTOBUF_C_CONFIG_H
#include "protobuf-c-config.h"
#endif
#include <stdio.h> /* for occasional printf()s */
#include <stdlib.h> /* for abort(), malloc() etc */
#include <string.h> /* for strlen(), memcpy(), memmove() */
#if HAVE_ALLOCA_H
#include <alloca.h>
#elif HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "protobuf-c.h"
int main(void){
uint32_t hexvalue = 0x20;
int gnuvalue;
uint8_t fake_out;
FILE *fp;
fp = fopen("binarydata.txt","w");
gnuvalue = uint32_pack (hexvalue, fake_out);
fprintf(fp,"%x",gnuvalue);
fclose(fp);
}
/* === pack() === */
/* Pack an unsigned 32-bit integer in base-128 encoding, and return the number of bytes needed:
this will be 5 or less. */
static inline size_t
uint32_pack (uint32_t value, uint8_t *out)
{
unsigned rv = 0;
if (value >= 0x80)
{
out[rv++] = value | 0x80;
value >>= 7;
if (value >= 0x80)
{
out[rv++] = value | 0x80;
value >>= 7;
if (value >= 0x80)
{
out[rv++] = value | 0x80;
value >>= 7;
if (value >= 0x80)
{
out[rv++] = value | 0x80;
value >>= 7;
}
}
}
/* assert: value<128 */
out[rv++] = value;
return &out;
}
}
您希望使用*
一元操作符对指针解引用,如下所示:
return *out;
这样做,它将返回存储在out
指向的位置的值。
你的代码有点奇怪
uint8_t fake_out;
gnuvalue = uint32_pack (hexvalue, fake_out);
而uint32_pack的原型需要uint8_t *
,所以它应该是&fake_out
。然后返回它,你只需要解引用指针来修改fake_out,就像*out = value;
一样。
如果您需要返回两个值(gnuvalue和fake_out),您可以这样做。
另一种选择是返回一个指向函数中malloc-ed的结构体的指针(然后您迟早需要释放它),并且该结构体同时保存"gnuvalue"one_answers"fake_out"。
您应该返回*out
。并更新评论以反映这一点。在实践中,似乎out
应该适合size_t
(即sizeof size_t
将足够大),但它是黑客的假设。
从main调用时,当前的方法将不起作用,因为fake_out
是uint8_t
,而不是uint8_t*
。当然&fakeout
会崩溃,所以不要这样做,你必须分配一个足够大的uint8_t
数组。