【问题标题】:creating a link between structures with void pointer使用 void 指针在结构之间创建链接
【发布时间】:2020-01-17 14:11:16
【问题描述】:

我想创建一个链表/树型结构,节点之间的链接为void*

struct node1{
  void* left;
  void* right;
}

struct node2{
 void* next; 
 int data;
}

int main(){

 struct node1* node1=malloc(sizeof(struct node1));
 struct node2* node2=malloc(sizeof(struct node2));
 node2->data=5;
 node1->left=*(struct node2*)node2);
 node1=node1->left

 }

我想使用node1 及其链接访问node2 的数据,但上面的代码不起作用。怎么了?

【问题讨论】:

  • 我发现*(struct node2*)node2 有问题。首先你不需要演员表,因为node2 已经是struct node2 * 类型。其次,您取消引用指针以获取实际结构本身。
  • 此外,node1=node1->left 会让你失去原来的node1 指针,导致内存泄漏。更不用说node1->left 应该指向一个node2 结构,它混淆了很多类型。为什么不能使用正确的类型?为什么你认为你需要使用void *?这应该解决什么问题?
  • 问题是你没有打开编译器的警告。它会告诉你你需要知道的一切。
  • 这是一项作业,我必须使用 void* 将结构绑定在一起

标签: c data-structures linked-list tree


【解决方案1】:

这个:

 node1->left=*(struct node2*)node2);

包含语法错误和不需要的转换。它还取消引用 node2 的值,这会导致错误。

这个:

 node1=node1->left;

也是。您不能为node1 分配不同类型的指针。当然,node1->leftvoid*,所以这实际上是一个有效的赋值,但它会导致 node2 被解释为 struct node1* 类型,这是错误的。

如果我正确理解您想要做什么,正确的代码将是:

int main(void) {
    struct node1* node1 = malloc(sizeof(struct node1));
    struct node2* node2 = malloc(sizeof(struct node2));

    node2->data = 5;
    node1->left= node2;

    // Access node2->data from node1:
    ((struct node2*)node1->left)->data;

    return 0;
}

【讨论】:

  • @PaulOgilvie thx 提示,事实证明这是问题中的错字。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 2021-04-20
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2015-01-04
相关资源
最近更新 更多