从void *到unsigned char *的指针行为的奇怪情况

时间:2013-12-11 01:06:24

标签: c++ c

我有一个函数,它接受一个void * buffer作为参数,并且必须将它传递给另一个带有unsigned char *的函数。这是一系列事件:

unsigned char   data[4];
populate(&data);

void populate (void * buf)
{
...
    unsigned char * datump = ((unsigned char * )buf);
    if ( Unwrap(datump) )
    {...}
}

bool  Unwrap (unsigned char* buf)
{
...
}

当我继续执行:Unwrap((unsigned char *)buf)时,它失败并且“没有匹配函数调用Unwrap [(unsigned char *)。 但是如果我在代码中使用像我一样的转换它就可以了!那是为什么?

问题是现在我必须做一些事情(请帮忙!)将数据从unsigned char *复制到void *。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

也许您应该在使用之前声明Unwrapdata是数组的地址,&data[0]是第一个元素的地址。它是平等但具有不同的含义。

答案 1 :(得分:1)

请注意,当你这样做时

unsigned char   data[4];
populate(&data);

您正在将char**传递给populate。当您尝试进行转换时,这会导致无法解决的问题(除了您指向内存中的某个随机位置之外)。

要修复的第一部分:

populate(data);

以下非常简单的代码编译并运行得很好:

#include <iostream>

bool f1(unsigned char* buf) {
  return true;
}

void populate(void *buf) {
  unsigned char* datump = (unsigned char*) buf;
  if(f1(datump)) std::cout << "it's true!" << std::endl;
}
int main(void) {
  unsigned char data[4];
  populate(data);
}

似乎只需要修复指针即可?