398,825 Members | 3,163 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 398,825 IT Pros & Developers. It's quick & easy.

warning: assignment discards qualifiers from pointer target type

Jason
P: n/a
I have a function (Inet_ntop) that returns const char * and if I try to
assign that return value to a char * variable, I get the gcc error message:
warning: assignment discards qualifiers from pointer target type

Does anyone know what this warning means? Why do I get it? The program
compiles and appears to work, but I'd like to understand the warning.

Here is basically what the code looks like:

char *str;
str = Inet_ntop(...); //returns const char *

Any help is appreciated. Thanks.

--
Jason
[ jake1138 AT yahoo DOT com ]
Nov 13 '05 #1
Share this Question
Share on Google+
6 Replies


Mike Wahler
P: n/a
"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm027n$uu0$1@terabinaries.xmission.com...
I have a function (Inet_ntop) that returns const char * and if I try to
assign that return value to a char * variable, I get the gcc error message: warning: assignment discards qualifiers from pointer target type

Does anyone know what this warning means?
It means you're walking on eggs. :-)
Why do I get it?
You have a good compiler.
The program
compiles and appears to work, but I'd like to understand the warning.
The moment you try to modify what the assigned-to pointer
points to, you could possibly induce undefined behavior.

Here is basically what the code looks like:

char *str;
str = Inet_ntop(...); //returns const char *
It's warning you that the "protection" of the pointer's
target provided by the 'const' qualifier is lost when
the 'const' is thrown away by assigning it to a "plain"
type 'char*' pointer.

It's warning you that you're boating in deep water,
and you've thrown your life preserver overboard.

const char array[]="whatever";
array[0] = 'X'; /* compiler must tell you, "Can't do that!" */

const char *cp = array;
cp[0] = 'X'; /* compiler must tell you, "Can't do that!" */
char *p = array; /* valid, but many compilers will warn you:
"Danger, Will Robinson!" */

/* because... */

p[0]; /* is valid, although possibly/probably not what you
really wanted, and has possiblity of undefined behavior */

Any help is appreciated. Thanks.


Write:

const char *str;
str = Inet_ntop(...); //returns const char *
The function returns type 'const char*' for a reason.
It's telling you "You can look, but don't touch the
target of the returned pointer."

HTH,
-Mike
Nov 13 '05 #2

Mike Wahler
P: n/a
"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm027n$uu0$1@terabinaries.xmission.com...
I have a function (Inet_ntop) that returns const char * and if I try to
assign that return value to a char * variable, I get the gcc error message: warning: assignment discards qualifiers from pointer target type

Does anyone know what this warning means?
It means you're walking on eggs. :-)
Why do I get it?
You have a good compiler.
The program
compiles and appears to work, but I'd like to understand the warning.
The moment you try to modify what the assigned-to pointer
points to, you could possibly induce undefined behavior.

Here is basically what the code looks like:

char *str;
str = Inet_ntop(...); //returns const char *
It's warning you that the "protection" of the pointer's
target provided by the 'const' qualifier is lost when
the 'const' is thrown away by assigning it to a "plain"
type 'char*' pointer.

It's warning you that you're boating in deep water,
and you've thrown your life preserver overboard.

const char array[]="whatever";
array[0] = 'X'; /* compiler must tell you, "Can't do that!" */

const char *cp = array;
cp[0] = 'X'; /* compiler must tell you, "Can't do that!" */
char *p = array; /* valid, but many compilers will warn you:
"Danger, Will Robinson!" */

/* because... */

p[0]; /* is valid, although possibly/probably not what you
really wanted, and has possiblity of undefined behavior */

Any help is appreciated. Thanks.


Write:

const char *str;
str = Inet_ntop(...); //returns const char *
The function returns type 'const char*' for a reason.
It's telling you "You can look, but don't touch the
target of the returned pointer." If you ignore this
warning, you're on your own.

HTH,
-Mike

Nov 13 '05 #3

James Hu
P: n/a
On 2003-10-08, Jason <jake1138@NO.SPAM.yahoo.com> wrote:

char *str;
str = Inet_ntop(...); //returns const char *


You should declare str variable to be the same type as that being
returned by Inet_ntop().

const char *str = Inet_ntop(/* ... */);

The "const" is a qualifier. It means the return value of Inet_ntop
is a pointer to data that should not be modified.

However, in the erroneous code, you assigned that pointer to a
regular "char *", which discards the "should not be modified"
qualifier.

-- James
Nov 13 '05 #4

Jason
P: n/a
Thanks Mike and James for your answers! I think I was confused as to how
const worked with pointers in that way, but now I understand.

--
Jason
[ jake1138 AT yahoo DOT com ]
Nov 13 '05 #5

Mike Wahler
P: n/a

"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm2j8v$fe$1@terabinaries.xmission.com...
Thanks Mike and James for your answers! I think I was confused as to how
const worked with pointers in that way, but now I understand.


It can get confusing. :-)

/* (0) */ int * pi; /* pointer to int */
/* (can modify p or *p) */

/* (1) */ int const * pci; /* pointer to const int */
/* (can modify p, but not *p) */

/* (2) */ const int * pci2; /* same as (1) */

/* (3) */ int * const cpi; /* const pointer to int */
/* (can modify *p, but not p */

/* (4) */ int const * const cpci; /* const pointer to const int */
/* (cannot modify p nor *p) */

/* (5) */ const int * const cpci2; /* same as (4) */
HTH,
-Mike
Nov 13 '05 #6

Mike Wahler
P: n/a
"Mike Wahler" <mkwahler@mkwahler.net> wrote in message
news:Z_hhb.4350$dn6.4134@newsread4.news.pas.earthl ink.net...
/* (4) */ int const * const cpci; /* const pointer to const int */
/* (cannot modify p nor *p) */

/* (5) */ const int * const cpci2; /* same as (4) */


Dang, that's what I get for 'copy-n-pasting' :-)

Of course the 'p' and '*p' in the comments refer to
the actual identifier in each declaration
('pci', 'cpi', etc.)

Sorry about that.

-Mike
Nov 13 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.