【问题标题】:Assignment from incompatible pointer type (structs, linked list)来自不兼容的指针类型(结构、链表)的赋值
【发布时间】:2013-09-08 22:39:39
【问题描述】:

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

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->next 会给我警告“来自不兼容的指针类型的分配”。

我的错误是什么? curr 和 next 都是 *dictionary_entry_t

类型

【问题讨论】:

    标签: c pointers


    【解决方案1】:

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

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

    struct _dictionary_entry_t *next;
    

    但是,我更喜欢另一种方式:typedeffing,然后再声明 struct。那么:

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

    【讨论】:

      【解决方案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))
      

      【讨论】:

      • 我也没想过这个。欣赏它。
      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2014-12-14
      • 2019-06-05
      • 2012-03-13
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多