【问题标题】:passing char* back and forth between functions在函数之间来回传递 char*
【发布时间】:2013-12-14 05:17:20
【问题描述】:

我有两个函数,我试图将缓冲区从一个函数传递给另一个函数并让它修改内容,但我似乎无法让它工作..这是我所拥有的:

void caller ()
{
    char *  datum;
    populate (&datum);
}

void populate (void * buf)
{
    unsigned char * datump;
    int dtsz;
    getData (datump,dtsz);   // This function puts "001" in datump and dtsz = 4 

    buf = new unsigned char[dtsz];
    memset(datumbuf,0,sizeof(buf));
    memcpy (buf,datump,dtsz);

}

当我调试时,一切似乎都与它应该的完全一样,直到我到达 memcpy。看起来 memcpy 实际上并没有做任何事情。 之所以做“datumbuf = new unsigned char[dtsz]”是因为“getData()”函数每次根据数据大小返回不同的大小,因此不能静态分配大小。

当我回到主“caller()”函数时,“数据”包含垃圾。

任何想法为什么会发生这种情况以及如何解决?

谢谢

【问题讨论】:

  • 填充不使用 buf。
  • 首先,sizeof(buf) 是指针的大小,而不是分配内存的大小。其次,分配给buf只会影响本地副本,造成内存泄漏。如果您打算通过将参数设置为void** 来解决此问题,以便您可以分配给*buf,您将无法隐式传递char**
  • 首先,void * buf 应该是char **buf。其次,你的函数根本没有使用buf
  • @chris, char** 完全可以转换为 void*。
  • @pvgoran,我的错,这只是void**。我将编辑我的评论,将其放在第三点。

标签: c++ c


【解决方案1】:

这不是 C++,而是 C。使用 std::string,如果您使用的是 C++,请忘记此类缓冲区。

您不能在populate 中修改buf。您没有为 datump 分配内存(不知道 getData 是做什么的)。

【讨论】:

    【解决方案2】:

    你的populate 函数应该返回一个指针。这样一来,一切就容易多了。

    char * populate()
    {
      ...
      buf = new unsigned char[dtsz];
      ...
      return buf;
    }
    

    ...然后你这样称呼它:

    char * datum = populate()
    

    您当前的代码不起作用,因为您对值和引用参数感到困惑。您通过“引用”populate(&datum) 传递数据,但“填充”将其视为值参数。

    【讨论】:

      【解决方案3】:

      那条 memset 行很奇怪而且错误,sizeof(datumbuf) 是指针大小(4 或 8),而不是数组长度。 如果它是 8,它将覆盖其他东西,因为您描述的数组只有 4 长。不过,我怀疑那是你的实际错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多