C语言 - 加载一个包含指向指针的指针的结构体

4

这会产生一个不兼容的警告:

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
  int key;
  int data;
  struct htData_* next;
  struct htData_* prev;
}htData_;

typedef struct
{
  int num_entries;
  struct htData_** entries;
}ht_;

ht_* new_ht(int num_entries);
int ht_add(ht_* ht_p, int key, int data);

int main()
{
  int num_entries = 20;
  //crate a hash table and corresponding reference                                                                                                              
  ht_* ht_p = new_ht(num_entries);
  //add data to the hash table                                                                                                                                  
  int key = 1305;
  ht_add(ht_p,key%num_entries,20);

  return 0;
}

ht_* new_ht(int num_entries)
{
  ht_ *ht_p;
  ht_ ht;
  ht.num_entries = num_entries;
  ht_p = &ht;

  //create an array of htData                                                                                                                                   
  htData_ *htDataArray;
  htDataArray = (htData_*) malloc(num_entries * sizeof(htData_));
  //point to the pointer that points to the first element in the array                                                                                          
  ht.entries = &htDataArray; // WARNING HERE!!!!!!!!!!!!!!!!

  return ht_p;
}

我正在尝试将**ptr复制到包含**ptrstruct中。

更新: 我简化的代码不准确,所以我发布了实际代码。


2
也请注明哪一行代码产生了警告 - iammilind
htData_ array[20] = htDataArray; 的目的是什么? - Mark Elliot
我添加了一个更好的、更易于理解的测试失败案例,以替换那行代码。感谢您的关注,我对缺乏组织表示歉意... - nick_name
2
只有在C++中才需要在malloc上进行强制类型转换。在普通的C语言中,建议跳过强制类型转换(它很冗长且容易出错)。 - hugomg
2个回答

4
问题在于struct htData_htData_不是同一件事情!对于编译器来说,struct htData_不存在——它是一个不完整的类型。另一方面,htData_是一个匿名结构体的typedef。要进行更详细的分析,请参见C++中structtypedef struct之间的区别
因此,您会收到警告,因为ht.entries被声明为struct htData_**类型,但是赋值语句的右侧类型为<anonymous struct>**。要解决这个问题,您需要定义struct htData_
typedef struct htData_
{
    ...
} htData_;

1

这行代码不正确:

htData_ array[20] = htDataArray;

你不能将指针分配给数组。 在您编辑的代码中,以下是有问题的行:
//point to the pointer that points to the first element in the array                                                                                          
  ht.entries = &htDataArray;

实际上,从语法上讲是正确的,所以不应该出现警告。但你在这里做错了事情。如果你想让ht.entries指向数组的第一个元素,那么你需要将其声明为:

htData_* entries;  // 'struct' keyword not needed ahead of declaration

并将其分配为,

ht.entries = &htDataArray[0];

那么使用更新后的替换行呢?我仍然会得到错误,但将一个分配给相同类型的是有意义的。 - nick_name
如果将 ht.entries =&htDataArray; 替换为 ht.entries =&htDataArray [0];,则仍会产生警告。我是否误解了您的评论?此外,我不仅想让 ht.entries 指向数组中的第一个元素。我想要一个指向指向数组中第一个元素的指针的指针。更简单地说,htDataArray 指向数组中的元素 0。我想指向 htDataArray,它是一个 **。 - nick_name
@nick_name,你把声明改成了 htData_* entries; 吗? - iammilind
我可以这样做,但那并不能达到我的目的。我想要一个指向数组第一个元素的指针的指针。 - nick_name
但是当前的代码无法帮助您获取指向第一个元素的指针。数组的第一个元素是htData_类型,指向它的指针将是htData_*。因此,您需要更改entries的声明。 - iammilind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接