C++ 在函数之间来回传递char*

C++ 在函数之间来回传递char*,c++,c,C++,C,我有两个函数,我试图将一个缓冲区从一个函数传递到另一个函数,并让它修改内容,但我似乎无法让它工作..以下是我的: void caller () { char * datum; populate (&datum); } void populate (void * buf) { unsigned char * datump; int dtsz; getData (datump,dtsz); // This function puts "001"

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

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()”函数时,“datum”包含垃圾

你知道为什么会发生这种情况以及如何解决吗


谢谢

< p>这不是C++,是使用<代码> STD::String < /Cord>,如果使用C++,请忽略这些缓冲区。
您不需要在
填充
中修改
buf
。你不为DATMP分配内存(不知道GATDATA是什么)。< /P> < P>这不是C++,是使用C <代码> STD::String < /C> >,如果使用C++,请忽略这些缓冲区。
您不需要在
填充
中修改
buf
。您没有为datump分配内存(不知道getData做什么)。

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

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

您的
填充函数应该只返回一个指针。这样一切都容易得多

char * populate()
{
  ...
  buf = new unsigned char[dtsz];
  ...
  return buf;
}
…然后你这样称呼它:

char * datum = populate()

您当前的代码无法工作,因为您混淆了值参数和引用参数。“通过引用”传递数据,
populate(&datum)
,但“populate”将其视为一个值参数。

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

char * populate()
{
  ...
  buf = new unsigned char[dtsz];
  ...
  return buf;
}
…然后你这样称呼它:

char * datum = populate()

您当前的代码无法工作,因为您混淆了值参数和引用参数。“通过引用”传递数据,
populate(&datum)
但“populate”将其视为一个值参数。

populate不使用buf。首先,
sizeof(buf)
是指针的大小,而不是分配内存的大小。其次,分配给
buf
只会影响本地副本,导致内存泄漏。如果您计划通过将参数设置为a
void**
来解决此问题,以便可以分配给
*buf
,则无法隐式传递
char**
。首先,
void*buf
应为
char**buf
。其次,您的函数根本没有使用
buf
@克里斯,char**完全可以转换为void*@pvgoran,我的错,它只是
void**
。我将编辑我的注释,将其与第三点放在一起。请不要使用buf。首先,
sizeof(buf)
是指针的大小,而不是分配内存的大小。其次,分配给
buf
只会影响本地副本,导致内存泄漏。如果您计划通过将参数设置为a
void**
来解决此问题,以便可以分配给
*buf
,则无法隐式传递
char**
。首先,
void*buf
应为
char**buf
。其次,您的函数根本没有使用
buf
@克里斯,char**完全可以转换为void*@pvgoran,我的错,它只是
void**
。我将编辑我的评论,将其与第三点放在一起。