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