【问题标题】:How to print the value of const void*如何打印 const void* 的值
【发布时间】:2012-11-22 18:22:33
【问题描述】:
#include <iostream>
using namespace std;

void fn(const void *l) {
    // How to print the value of l. The below line is giving error
    cout << "***" << *l;
}

int main() {
    cout << "Hello World!";
    int d = 5;

    fn((char *) &d);
    return 0;
}

错误:

在函数'void fn(const void*)'中: 第 8 行:错误:'const void*' 不是指向对象的指针类型 编译因 -Wfatal-errors 而终止。

如下所示尝试了铸造。它没有帮助。请提供建议。

#include <iostream>
using namespace std;

void fn(const void *l) {
    // How to print the value of l. The below line is giving error
    int *pInt = static_cast<char*>(l);
    cout << *pInt;
}

int main() {
    cout << "Hello World!";
    int d = 5;

    fn((char *) &d);
    return 0;
}

在函数'void fn(const void*)'中: 第 9 行:错误:从类型 'const void*' 到类型 'char*' 的 static_cast 抛弃了 constness 编译因 -Wfatal-errors 而终止

【问题讨论】:

  • 您不能取消引用指向 cv void. 的指针。
  • void* 无法取消引用。它必须被转换成一个具体类型的指针。

标签: c++


【解决方案1】:

你想显示指针本身的值,还是它所指向的值?第一种情况,简单

 cout << p;

就足够了。如果你想实现第二件事——这是不可能的——指针指向 void,它不能被取消引用,因为编译器不知道它背后“隐藏”的值的类型。

【讨论】:

  • +1,您实际上是在回答这个问题,尽管 OP 可能没有意识到这一点。
【解决方案2】:

你不能。除非您将 void 指针解释为某种东西。

设身处地为函数着想:我给你一个指向“某事”的指针。你不知道那是什么东西。我告诉你打印那个东西。你是做什么的?

【讨论】:

    【解决方案3】:

    在取消引用 void 指针时,该标准需要显式强制转换。

    不仅编译器本身,标准也不允许这样做。

    【讨论】:

      【解决方案4】:
      cout << "***" << *(int*)l ;
      

      【讨论】:

      • 如果我称它为fn(new char); 会怎样?这不是未定义的行为吗?这是最糟糕的建议。导致预期行为的东西,并且为未经训练的眼睛提供了解决方案。危险。
      • 处理这个 Luchian 的正确方法是什么?
      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 2016-09-07
      • 2012-07-09
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多