【问题标题】:How to return a value from a pointer in C如何从C中的指针返回值
【发布时间】:2011-07-08 19:38:16
【问题描述】:

我有以下代码,我想返回 '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;
  }
}

【问题讨论】:

  • 我现在收到以下错误,第 56 行的“'uint32_pack' 的类型冲突”和 ling43 的“'uint32_pack' 的先前隐式声明在这里”
  • 你必须在使用前声明函数。看来您应该复习 C 的基础知识。
  • 确实。我认为@Sam 应该继续发布他的评论作为答案,因为他的评论实际上也先于我们所有的答案。
  • gnuvalue 声明为 int,return *out 将返回 uint8_t;虽然这没有问题,但它可能是你没有按照你的意思做的线索

标签: c function pointers


【解决方案1】:

您想使用* 一元运算符取消引用指针,如下所示:

return *out;

这样做,它将返回存储在out 指向的位置的值。

【讨论】:

    【解决方案2】:

    您的代码中有一些奇怪的地方

      uint8_t fake_out;
      gnuvalue = uint32_pack (hexvalue, fake_out);
    

    而 uint32_pack 的原型需要uint8_t *,所以它应该是&amp;fake_out。然后返回它,你只需要取消引用修改 fake_out 的指针,比如*out = value;

    如果您需要返回两个值(gnuvalue 和 fake_out),您可以这样做。

    另一种选择是在函数中返回一个指向 malloc 结构的指针(然后您需要尽快释放它),并且该结构同时包含“gnuvalue”和“fake_out”。

    【讨论】:

      【解决方案3】:

      您应该返回*out。并更新评论以反映这一点。在实践中,out 似乎应该适合 size_t(即sizeof size_t 会足够大),但假设它是 hack-ish。

      在从 main 调用时,当前方式将不起作用,因为 fake_outuint8_t,而不是 uint8_t*。当然&amp;fakeout 会崩溃所以不要那样做,你必须分配一个足够大的uint8_t 数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        相关资源
        最近更新 更多