如何在C语言中从指针返回值



我有以下代码,我想返回'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_outuint8_t,而不是uint8_t*。当然&fakeout会崩溃,所以不要这样做,你必须分配一个足够大的uint8_t数组。

最新更新