我有两个函数,我正在尝试将缓冲区从一个函数传递到另一个函数并让它修改内容,但我似乎无法让它工作......我有什么:
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”包含垃圾。
为什么会发生这种情况以及如何解决这个问题?
由于
答案 0 :(得分:2)
这不是C ++,它是C.如果你正在使用C ++,请使用std::string
并忘记这些缓冲区。
您不会修改buf
中的populate
。你没有为datump分配内存(不知道getData做了什么)。
答案 1 :(得分:2)
您的populate
函数应该返回指针。这样一切都变得容易了。
char * populate()
{
...
buf = new unsigned char[dtsz];
...
return buf;
}
...然后你这样称呼它:
char * datum = populate()
您当前的代码不起作用,因为您在值和参考参数之间感到困惑。您通过引用'{1}}传递数据,但`populate将其视为值参数。
答案 2 :(得分:1)
该memset行奇怪且错误,sizeof(datumbuf)
是指针大小(4或8),而不是数组长度。
如果它是8,它将写入其他东西,因为你描述的数组只有4长。不过,我怀疑这是你的实际错误。