Initialization discards qualifiers from pointer target type
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:
Remove the const modifier of param:
void test(char *str) { char *s = str; }
Declare the target variable also as const:
void test(const char *str) { const char *s = str; }
Use a type convert:
void test(const char *str) { char *s = (char *)str; }
Related videos on Youtube

Crystal
Updated on June 14, 2020Comments
-
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 about 4 yearsJust 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 almost 13 yearsDumb 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 almost 13 years@Crystal -
const LIST *PrintList(const LIST *head) { ... }
-
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 about 7 yearsLove it when it gets explained in natural language, as if the compiler could talk. Great explanation!