web-dev-qa-db-ja.com

初期化は、ポインターのターゲット型から修飾子を破棄します

link text で参照した単一リンクリストのリストを印刷しようとしています。動作しますが、コンパイラの警告が表示されます。

Initialization discards qualifiers from pointer target type

(start = headの宣言時)および

return discards qualifiers from pointer target type

(returnステートメントで)このコードで:

/* 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を使用しています。何かご意見は?

35
Crystal

この部分です:

LIST *start = head;

関数のパラメーターは定数へのポインター、const LIST *head;これは、それが指しているものを変更できないことを意味します。ただし、上記のポインターは非constを指します。それを逆参照して変更することができます。

constである必要もあります:

const LIST *start = head;

同じことが戻り値の型にも当てはまります。


コンパイラが言っているのは、「ねえ、あなたは呼び出し側に「私は何も変えない」と言ったが、あなたはその機会を開いている」

69
GManNickG

次の関数では、遭遇した警告が表示されます。

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;
    }
    
21
Eric Wang