C错误:请求成员___不是结构或联合

时间:2013-05-19 07:25:09

标签: c list compiler-errors linked-list hashtable

所以代码说List和size不是结构?

typedef struct HashTable{
    int size;
    ListRef **List; 
} hash;

typedef struct hash *hash_ref;

hash_ref *newHash(int size){
    hash_ref *hashed= NULL;
    if(size<1){
        return NULL;
    }
    if( (hashed=malloc(sizeof(hash))) ==NULL){
        return NULL;
    }
    if( (hashed->List=malloc(sizeof(ListRef*)*size)) ==NULL){
        return NULL;
    }
    for(int i=0; i<size; i++){
        hashed->List[i]=NULL;
    }
    hashed->size=size;

    return hashed;
}

这是我的列表功能

typedef struct Node{
    long key;/*book id*/
    ListRef data;
    struct Node* next;
    struct Node* prev;
}NodeType;

typedef NodeType* NodeRef;

typedef struct ListHdr{
    NodeRef first;
    NodeRef last;
    NodeRef current;
    long length;
}ListHdr;

我想知道这个错误是什么?我忘了添加ListHdr在我的List头文件中更改为ListRef ..这包含在我的哈希表模块中。

我目前正在尝试创建2个哈希表。一个有表存储2个长整数。另一个哈希表采用1个长整数和一个链表(有2个长整数)。

2 个答案:

答案 0 :(得分:3)

hash_ref被指定为指针hash,因此您必须将hashed声明为hash_ref hashed,而不是hash_ref *hashed。 (后者会有效地创建指向hash的指针。)

除此之外,您应该从声明struct的typedef中省略hash_ref。目前hash_ref未声明为hash,而是指向尚未声明的struct hash。这只是因为编译器将其解释为struct hash的前向声明而编译。此解释将导致尝试取消引用hash_ref的任何代码失败,并显示“存储大小为struct hash未知”等错误。

答案 1 :(得分:1)

这意味着你要么在一个不是结构的东西上调用.,要么在一个不是直接指向结构或联合的指针的指针上调用->

hash_ref * hashed是一个指向HashTable的DOUBLE指针。单个解除引用仍然为您提供HashTable指针,该指针不是联合或结构。