初始化会丢弃指针目标类型的限定符

时间:2010-02-23 05:47:07

标签: c linked-list

我正在尝试打印我在link text中提到的单链表的列表。它有效,但我确实得到了编译器警告:

  

Initialization discards qualifiers from pointer target type

(关于start = head的声明)和

  

return discards qualifiers from pointer target type

(在返回语句中)在此代码中:

/* Prints singly linked list and returns head pointer */
LIST *PrintList(const LIST *head) 
{
    LIST *start = head;

    for (; start != NULL; start = start->next)
        printf("%15s %d ea\n", head->str, head->count);

    return head;
}

我正在使用XCode。有什么想法吗?

2 个答案:

答案 0 :(得分:68)

这是这一部分:

LIST *start = head;

该函数的参数是指向常量const LIST *head的指针;这意味着你无法改变它指向的内容。但是,上面的指针是非const;你可以取消引用它并改变它。

它也需要const

const LIST *start = head;

这同样适用于您的退货类型。


所有编译器都在说:“嘿,你对打电话者说'我不会改变任何东西',但你正在为此开辟机会。”

答案 1 :(得分:21)

在以下功能中,会收到您遇到的警告。

void test(const char *str) {
  char *s = str;
}

有3种选择:

  1. 删除param的const修饰符:

    void test(char *str) {
      char *s = str;
    }
    
  2. 将目标变量声明为const:

    void test(const char *str) {
      const char *s = str;
    }
    
  3. 使用类型转换:

    void test(const char *str) {
      char *s = (char *)str;
    }