Initialization discards qualifiers from pointer target type

96,256

Solution 1

It's this part:

LIST *start = head;

The parameter for the function is a pointer to a constant, const LIST *head; this means you cannot change what it is pointing to. However, the pointer above is to non-const; you could dereference it and change it.

It needs to be const as well:

const LIST *start = head;

The same applies to your return type.


All the compiler is saying is: "Hey, you said to the caller 'I won't change anything', but you're opening up opportunities for that."

Solution 2

In following function, would get the warning that you encountered with.

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

There are 3 choices:

  1. Remove the const modifier of param:

    void test(char *str) {
      char *s = str;
    }
    
  2. Declare the target variable also as const:

    void test(const char *str) {
      const char *s = str;
    }
    
  3. Use a type convert:

    void test(const char *str) {
      char *s = (char *)str;
    }
    
Share:
96,256

Related videos on Youtube

Crystal
Author by

Crystal

Updated on June 14, 2020

Comments

  • Crystal
    Crystal over 2 years

    I'm trying to print the list of a singly linked list that I referred to in link text. It works, but I do get the compiler warnings:

    Initialization discards qualifiers from pointer target type

    (on declaration of start = head) and

    return discards qualifiers from pointer target type

    (on return statement) in this code:

    /* 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;
    }
    

    I am using XCode. Any thoughts?

    • jozxyqk
      jozxyqk about 4 years
      Just FYI I've had gcc print unidentified warnings like this that I think are controlled by -Wwrite-strings. There's -Wdiscarded-qualifiers, -Wcast-qual and clang's -Wincompatible-pointer-types-discards-qualifiers which look related too.
  • Crystal
    Crystal almost 13 years
    Dumb question, but what does a const return type look like? I tried searching on the web, and I can't seem to find one.
  • R Samuel Klatchko
    R Samuel Klatchko almost 13 years
    @Crystal - const LIST *PrintList(const LIST *head) { ... }
  • CivFan
    CivFan over 7 years
    The parameter for the function is a constant pointer - incorrect. const LIST *head declares head as a pointer to a constant LIST. See: c-faq.com/decl/constparm.html -- perhaps this is just a misunderstanding in the wording.
  • Zimano
    Zimano about 7 years
    Love it when it gets explained in natural language, as if the compiler could talk. Great explanation!