从不兼容的指针类型(结构,链表)分配

时间:2013-09-08 22:39:39

标签: c pointers

使用链接列表创建字典数据结构。

typedef struct _dictionary_entry_t
{
    const char* key;
    const char* value;
    struct dictionary_entry_t *next;
    struct dictionary_entry_t *prev;

} dictionary_entry_t;

typedef struct _dictionary_t
{   
    dictionary_entry_t *head;
    dictionary_entry_t *curr;
    int size; 

} dictionary_t;

使用函数将字典条目添加到链表。

int dictionary_add(dictionary_t *d, const char *key, const char *value)
{
    if (d->curr == NULL) //then list is empty
    {
        d->head = malloc(sizeof(dictionary_entry_t));
        d->head->key = key;  //set first dictionary entry key
        d->head->value = value; //set first dictionary entry value
        d->head->next = NULL; 
        //d->curr = d->head;
    }

    else 
    {
        d->curr = d->head;

        while (strcmp((d->curr->key), key) != 0 && d->curr != NULL) //while keys don't match and haven't reached end of list... 
        {
            d->curr = d->curr->next; 

        } 
    }


    return -1;
}

将d-> curr分配给d-> curr->接下来给我警告“从不兼容的指针类型分配”。

这里我的错误是什么? curr和next都属于* dictionary_entry_t

类型

2 个答案:

答案 0 :(得分:5)

nextstruct dictionary_entry_t *,但d->currdictionary_entry_t *又名struct _dictionary_entry_t *。请注意下划线的差异。

解决此问题的一种方法是与您的下划线保持一致,将next声明为:

struct _dictionary_entry_t *next;

但是,在申报typedef之前,我更喜欢不同的方式:struct fing。然后:

typedef struct _dictionary_entry_t dictionary_entry_t;
struct _dictionary_entry_t {
    /* ... */
    dictionary_entry_t *next;
    /* ... */
};

答案 1 :(得分:2)

除了@icktoofay提出的问题之外,另一个问题是你的循环条件:

while (strcmp((d->curr->key), key) != 0 && d->curr != NULL)

如果d->currNULL,则当您执行strcmp()时,您尝试取消引用NULL指针。坏事会发生。反转那些:

while ((d->curr != NULL) && strcmp(d->curr->key, key) != 0)

或者,更简洁:

while (d->curr && strcmp (d->cur->key, key))