【问题标题】:Weird case of pointer behaviour from void* to unsigned char*从 void* 到 unsigned char* 的指针行为的奇怪情况
【发布时间】:2013-12-11 01:06:23
【问题描述】:

我有一个函数,它接受一个 void * 缓冲区作为参数,并且必须将它传递给另一个接受 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 *。

非常感谢任何帮助。

【问题讨论】:

  • 我不明白为什么它不适用于演员阵容。这似乎很奇怪。
  • data 中不使用& 试试。 data == &data[0].
  • 在代码中显示失败的上下文。指定您是使用 C 还是 C++ 进行编译。 “Unwrap[(unsigned char*)”中的[ 是什么错字?有哪些其他错别字?
  • 请分享头文件中的声明。我的猜测是它与实现略有不同。

标签: c++ c


【解决方案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);
}

似乎只需要修复指针?

【讨论】:

    【解决方案2】:

    也许你应该在使用之前声明Unwrapdata 是数组的地址,&amp;data[0] 是第一个元素的地址。相等但意义不同。

    【讨论】:

    • 其实是在头文件中声明的。
    猜你喜欢
    • 2017-03-13
    • 2013-06-12
    • 1970-01-01
    • 2014-08-13
    • 2017-03-12
    • 2016-01-20
    • 2021-07-28
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多