2011-07-26 101 views
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; 
} 

我试图复制**ptrstruct包含**ptr

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

+2

还提到,该线生产的警告 – iammilind

+0

什么'htData_数组[20] = htDataArray;'打算做什么? –

+0

我添加了一个更好,更容易理解的测试失败案例,专门替换该行。感谢您的期待,并为缺乏组织而表示歉意...... –

回答

4

的问题是,struct htData_htData_的一样!就编译器而言,struct htData_不存在 - 它是一种不完整的类型。另一方面,htData_对于匿名结构是typedef。有关更详细的分析,请参见Difference between struct and typedef struct in C++

因此,您会收到警告,因为ht.entries被宣布为struct htData_**类型,但该作业的右侧有<anonymous struct>**类型。为了解决这个问题,你需要定义struct htData_

typedef struct htData_ 
{ 
    ... 
} htData_; 
+0

+1,这是有用的信息 – iammilind

+0

这非常有帮助。感谢您的洞察力。 –

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]; 
+0

如何使用该行的更新替换?我仍然遇到错误,但将**分配给相同类型的**是有意义的。 –

+0

如果ht.entries =&htDataArray,则仍会产生警告;由ht.entries =&htDataArray [0];取代。我误解了你的评论吗?此外,我不想只让ht.entries指向数组中的第一个元素。我想要一个指向指向数组中第一个元素的指针的指针。更简单地说,htDataArray指向数组中的元素0。我想指向htDataArray,它是一个**。 –

+0

@nick_name,你是否将声明更改为'htData_ * entries;'? – iammilind