warning: assignment discards qualifiers from pointer target type

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jason

    #1

    warning: assignment discards qualifiers from pointer target type

    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

    #2
    Re: warning: assignment discards qualifiers from pointer target type

    "Jason" <jake1138@NO.SP AM.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


    Comment

    • Mike Wahler

      #3
      Re: warning: assignment discards qualifiers from pointer target type

      "Jason" <jake1138@NO.SP AM.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



      Comment

      • James Hu

        #4
        Re: warning: assignment discards qualifiers from pointer target type

        On 2003-10-08, Jason <jake1138@NO.SP AM.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

        Comment

        • Jason

          #5
          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 ]


          Comment

          • Mike Wahler

            #6
            Re: warning: assignment discards qualifiers from pointer target type


            "Jason" <jake1138@NO.SP AM.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


            Comment

            • Mike Wahler

              #7
              Re: (corr) warning: assignment discards qualifiers from pointer target type

              "Mike Wahler" <mkwahler@mkwah ler.net> wrote in message
              news:Z_hhb.4350 $dn6.4134@newsr ead4.news.pas.e arthlink.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


              Comment

              Working...