Connecting Tech Pros Worldwide Forums | Help | Site Map

warning: assignment discards qualifiers from pointer target type

Jason
Guest
 
Posts: n/a
#1: Nov 13 '05
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 ]



Mike Wahler
Guest
 
Posts: n/a
#2: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type


"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm027n$uu0$1@terabinaries.xmission.com...[color=blue]
> 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[/color]
message:[color=blue]
> warning: assignment discards qualifiers from pointer target type
>
> Does anyone know what this warning means?[/color]

It means you're walking on eggs. :-)
[color=blue]
> Why do I get it?[/color]

You have a good compiler.
[color=blue]
>The program
> compiles and appears to work, but I'd like to understand the warning.[/color]

The moment you try to modify what the assigned-to pointer
points to, you could possibly induce undefined behavior.
[color=blue]
>
> Here is basically what the code looks like:
>
> char *str;
> str = Inet_ntop(...); //returns const char *[/color]

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

[color=blue]
> Any help is appreciated. Thanks.[/color]

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


Mike Wahler
Guest
 
Posts: n/a
#3: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type


"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm027n$uu0$1@terabinaries.xmission.com...[color=blue]
> 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[/color]
message:[color=blue]
> warning: assignment discards qualifiers from pointer target type
>
> Does anyone know what this warning means?[/color]

It means you're walking on eggs. :-)
[color=blue]
> Why do I get it?[/color]

You have a good compiler.
[color=blue]
>The program
> compiles and appears to work, but I'd like to understand the warning.[/color]

The moment you try to modify what the assigned-to pointer
points to, you could possibly induce undefined behavior.
[color=blue]
>
> Here is basically what the code looks like:
>
> char *str;
> str = Inet_ntop(...); //returns const char *[/color]

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

[color=blue]
> Any help is appreciated. Thanks.[/color]

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



James Hu
Guest
 
Posts: n/a
#4: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type


On 2003-10-08, Jason <jake1138@NO.SPAM.yahoo.com> wrote:[color=blue]
>
> char *str;
> str = Inet_ntop(...); //returns const char *
>[/color]

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
Jason
Guest
 
Posts: n/a
#5: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type


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 ]


Mike Wahler
Guest
 
Posts: n/a
#6: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type



"Jason" <jake1138@NO.SPAM.yahoo.com> wrote in message
news:bm2j8v$fe$1@terabinaries.xmission.com...[color=blue]
> 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.[/color]

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


Mike Wahler
Guest
 
Posts: n/a
#7: Nov 13 '05

re: warning: assignment discards qualifiers from pointer target type


"Mike Wahler" <mkwahler@mkwahler.net> wrote in message
news:Z_hhb.4350$dn6.4134@newsread4.news.pas.earthl ink.net...
[color=blue]
> /* (4) */ int const * const cpci; /* const pointer to const int */
> /* (cannot modify p nor *p) */
>
> /* (5) */ const int * const cpci2; /* same as (4) */[/color]

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


Closed Thread