另一个无效*主题; 我只是要问,因为我很困惑

Mus*_*shy 0 c99 void-pointers c++11

好吧,虽然堆栈上的详细信息void*,书籍喜欢The C Programming Language (K&R)The C++ Programming Language (Stroustrup).我学到了什么?这void*是一个没有推断类型的通用指针.它需要强制转换为任何已定义的类型,并且打印void*只会产生地址.

还有什么我知道的? void*不能被解除引用,到目前为止仍然是C/C++我发现了很多关于但很少理解的一个项目.

我知道它必须是强制转换的,*(char*)void*但对我来说没有任何意义的generic指针是我必须知道我需要什么类型来获取值.我是一名Java程序员; 我理解泛型类型,但这是我挣扎的事情.

所以我写了一些代码

typedef struct node
{
  void* data;
  node* link;
}Node;

typedef struct list
{
   Node* head;
}List;

Node* add_new(void* data, Node* link);

void show(Node* head);

Node* add_new(void* data, Node* link)
{
  Node* newNode = new Node();
  newNode->data = data;
  newNode->link = link;

  return newNode;
}

void show(Node* head)
{
  while (head != nullptr)
  {
      std::cout << head->data;
      head = head->link;
  }
}

int main()
{
  List list;

  list.head = nullptr;

  list.head = add_new("My Name", list.head);

  list.head = add_new("Your Name", list.head);

  list.head = add_new("Our Name", list.head);

  show(list.head);

  fgetc(stdin);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我稍后会处理内存释放.假设我不了解存储的类型void*,我该如何获取值? 意味着我已经需要知道这种类型了,并没有揭示出void*我在遵循这里的内容时的一般性质,尽管仍然没有理解.

为什么我期望void*合作和编译器自动抛出堆内或堆栈中某些寄存器内部隐藏的类型?

R S*_*ahu 5

我稍后会处理内存释放.假设我不了解void*中存储的类型,我该如何获取值?

你不能.你必须知道的有效类型的指针可以,然后才能取消对它的引用被转换为.

以下是使用泛型类型的几个选项:

  1. 如果您能够使用C++ 17编译器,则可以使用std::any.
  2. 如果您能够使用boost库,则可以使用boost::any.

  • @Mushy,不,不是核心语言.尝试以[`std :: any`](http://en.cppreference.com/w/cpp/utility/any)和[`boost :: any`](http)的形式制作通用对象类型://www.boost.org/doc/libs/1_61_0/doc/html/any.html) (2认同)