variable length array (was: question about dynamic memory allocation)

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

    #1

    variable length array (was: question about dynamic memory allocation)

    Hi,

    I decided to start a new topic about my memory allocation question. One
    of the answers was that variable length arrays are possible using C99. I
    found this topic that also mentions it.



    I did some test, but I get strange results:

    int size_array = sizeof(struct ip) + cnf->msg_length;
    unsigned char packet[size_array];

    And then, when asking the size of the 'packet' variable I get 4. How is
    that? It should be another number (31).. but I guess i'm getting the
    size of type unsigned char. Right?


    Thanks,

    FBM
  • Skarmander

    #2
    Re: variable length array (was: question about dynamic memory allocation)

    Fernando Barsoba wrote:[color=blue]
    > I decided to start a new topic about my memory allocation question. One
    > of the answers was that variable length arrays are possible using C99. I
    > found this topic that also mentions it.
    >
    > http://groups.google.com/group/comp....335d22d6e6fb34
    >
    >
    > I did some test, but I get strange results:
    >
    > int size_array = sizeof(struct ip) + cnf->msg_length;
    > unsigned char packet[size_array];
    >
    > And then, when asking the size of the 'packet' variable I get 4. How is
    > that? It should be another number (31).. but I guess i'm getting the
    > size of type unsigned char. Right?
    >[/color]
    Technically there's no way to tell, because we don't know what system
    you're compiling this on.

    That said, you're probably getting the size of an unsigned char*, to
    which `packet' decays.

    If sizeof packet != size_array after the declarations above, your
    compiler does not conform to the C99 standard. gcc in particular does
    not support VLAs; it supports an earlier gcc extension that is similar
    but not identical to C99 VLAs.

    S.

    Comment

    • Artie Gold

      #3
      Re: variable length array (was: question about dynamic memory allocation)

      Fernando Barsoba wrote:[color=blue]
      > Hi,
      >
      > I decided to start a new topic about my memory allocation question. One
      > of the answers was that variable length arrays are possible using C99. I
      > found this topic that also mentions it.
      >
      > http://groups.google.com/group/comp....335d22d6e6fb34
      >
      >
      > I did some test, but I get strange results:
      >
      > int size_array = sizeof(struct ip) + cnf->msg_length;
      > unsigned char packet[size_array];
      >
      > And then, when asking the size of the 'packet' variable I get 4. How is
      > that? It should be another number (31).. but I guess i'm getting the
      > size of type unsigned char. Right?
      >[/color]

      Show us the code you used to test.
      [You passed `packet' to a function, didn't you...]

      HTH,
      --ag

      --
      Artie Gold -- Austin, Texas
      http://goldsays.blogspot.com (new post 8/5)
      http://www.cafepress.com/goldsays
      "If you have nothing to hide, you're not trying!"

      Comment

      • Fernando Barsoba

        #4
        Re: variable length array (was: question about dynamic memory allocation)

        Artie Gold wrote:[color=blue]
        > Fernando Barsoba wrote:[color=green]
        >> Hi,
        >>
        >> I decided to start a new topic about my memory allocation question. One
        >> of the answers was that variable length arrays are possible using C99. I
        >> found this topic that also mentions it.
        >>
        >> http://groups.google.com/group/comp....335d22d6e6fb34
        >>
        >>
        >> I did some test, but I get strange results:
        >>
        >> int size_array = sizeof(struct ip) + cnf->msg_length;
        >> unsigned char packet[size_array];
        >>
        >> And then, when asking the size of the 'packet' variable I get 4. How is
        >> that? It should be another number (31).. but I guess i'm getting the
        >> size of type unsigned char. Right?
        >>[/color]
        >
        > Show us the code you used to test.
        > [You passed `packet' to a function, didn't you...][/color]

        I pass 'packet' to a function later on.. but not for this test. I
        checked the size of 'packet' after[color=blue][color=green]
        >>unsigned char packet[size_array];[/color][/color]
        and there's where I get the value 4.

        Regarding to the other question, I'm using Eclipse + CDT (and the
        compiler is the one that comes with Cygwin which I am using too).

        FBM

        Comment

        • Keith Thompson

          #5
          Re: variable length array (was: question about dynamic memoryallocatio n)

          Fernando Barsoba <fbarsoba@veriz on.net> writes:
          [snip][color=blue]
          > I did some test, but I get strange results:
          >
          > int size_array = sizeof(struct ip) + cnf->msg_length;
          > unsigned char packet[size_array];
          >
          > And then, when asking the size of the 'packet' variable I get 4. How is
          > that? It should be another number (31).. but I guess i'm getting the
          > size of type unsigned char. Right?[/color]

          No, sizeof(unsigned char) is 1 by definition. It looks like it could
          be sizeof(unsigned char*), but that's not

          How exactly did you ask the size of the 'packet' variable? Show us
          some code.

          Here's an example that works properly with gcc 2.95.2, 3.4.4, and
          4.0.2:

          #include <stdio.h>
          int main(void)
          {
          int len = 42;
          char vla[len];
          printf("sizeof vla = %d\n", (int)sizeof vla);
          return 0;
          }

          The output is:

          sizeof vla = 42

          If you passed it as an argument to a function and applied sizeof to
          the parameter, you'd get the size of the pointer, but that's because
          array expressions decay to pointers in most contexts; if you apply
          sizeof directly to the array object, it doesn't decay and you get the
          size of the array.

          --
          Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
          San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
          We must do something. This is something. Therefore, we must do this.

          Comment

          • Barry Schwarz

            #6
            Re: variable length array (was: question about dynamic memory allocation)

            On Thu, 10 Nov 2005 00:31:56 GMT, Fernando Barsoba
            <fbarsoba@veriz on.net> wrote:
            [color=blue]
            >Hi,
            >
            >I decided to start a new topic about my memory allocation question. One
            >of the answers was that variable length arrays are possible using C99. I
            >found this topic that also mentions it.
            >
            >http://groups.google.com/group/comp....335d22d6e6fb34
            >
            >I did some test, but I get strange results:
            >
            > int size_array = sizeof(struct ip) + cnf->msg_length;
            > unsigned char packet[size_array];
            >
            >And then, when asking the size of the 'packet' variable I get 4. How is
            >that? It should be another number (31).. but I guess i'm getting the
            >size of type unsigned char. Right?[/color]

            Not likely. An unsigned char is guaranteed to have a size of one.


            <<Remove the del for email>>

            Comment

            • Skarmander

              #7
              Re: variable length array (was: question about dynamic memory allocation)

              Keith Thompson wrote:[color=blue]
              > Fernando Barsoba <fbarsoba@veriz on.net> writes:
              > [snip]
              >[color=green]
              >>I did some test, but I get strange results:
              >>
              >> int size_array = sizeof(struct ip) + cnf->msg_length;
              >> unsigned char packet[size_array];
              >>
              >>And then, when asking the size of the 'packet' variable I get 4. How is
              >>that? It should be another number (31).. but I guess i'm getting the
              >>size of type unsigned char. Right?[/color]
              >
              >
              > No, sizeof(unsigned char) is 1 by definition. It looks like it could
              > be sizeof(unsigned char*), but that's not
              >
              > How exactly did you ask the size of the 'packet' variable? Show us
              > some code.
              >
              > Here's an example that works properly with gcc 2.95.2, 3.4.4, and
              > 4.0.2:
              >[/color]
              <snip>
              And there's me badmouthing gcc about not supporting VLAs yet. At least
              this part works. :-)

              S.

              Comment

              • Keith Thompson

                #8
                Re: variable length array (was: question about dynamic memoryallocatio n)

                Fernando Barsoba <fbarsoba@veriz on.net> writes:[color=blue]
                > Artie Gold wrote:[color=green]
                >> Fernando Barsoba wrote:[/color][/color]
                [snip][color=blue][color=green][color=darkred]
                >>> I did some test, but I get strange results:
                >>>
                >>> int size_array = sizeof(struct ip) + cnf->msg_length;
                >>> unsigned char packet[size_array];
                >>>
                >>> And then, when asking the size of the 'packet' variable I get 4. How is
                >>> that? It should be another number (31).. but I guess i'm getting
                >>> the size of type unsigned char. Right?
                >>>[/color]
                >> Show us the code you used to test.
                >> [You passed `packet' to a function, didn't you...][/color]
                >
                > I pass 'packet' to a function later on.. but not for this test. I
                > checked the size of 'packet' after[color=green][color=darkred]
                > >>unsigned char packet[size_array];[/color][/color]
                > and there's where I get the value 4.[/color]

                That shouldn't be happening.

                Show us the code you used to test. That means posting a complete
                self-contained program that we can compile and run ourselves, along
                with the exact output that it gave you. Without that, we really can't
                help.
                [color=blue]
                > Regarding to the other question, I'm using Eclipse + CDT (and the
                > compiler is the one that comes with Cygwin which I am using too).[/color]

                Cygwin comes with gcc (version 3.4.4 if you've updated it recently).

                --
                Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
                San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
                We must do something. This is something. Therefore, we must do this.

                Comment

                • Fernando Barsoba

                  #9
                  Re: variable length array (was: question about dynamic memory allocation)

                  Keith Thompson wrote:[color=blue]
                  > Fernando Barsoba <fbarsoba@veriz on.net> writes:[color=green]
                  >> Artie Gold wrote:[color=darkred]
                  >>> Fernando Barsoba wrote:[/color][/color]
                  > [snip][color=green][color=darkred]
                  >>>>
                  >>>>
                  >>> Show us the code you used to test.
                  >>> [You passed `packet' to a function, didn't you...][/color]
                  >> I pass 'packet' to a function later on.. but not for this test. I
                  >> checked the size of 'packet' after[color=darkred]
                  >> >>unsigned char packet[size_array];[/color]
                  >> and there's where I get the value 4.[/color]
                  >
                  > That shouldn't be happening.
                  >
                  > Show us the code you used to test. That means posting a complete
                  > self-contained program that we can compile and run ourselves, along
                  > with the exact output that it gave you. Without that, we really can't
                  > help.[/color]

                  Ok, I tested the following code:

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <netinet/ip.h>


                  int main(int argc, char **argv) {

                  int size_array = sizeof(struct ip) + 11;
                  unsigned char packet[size_array];
                  // unsigned char ipheader_cpy[sizeof(struct ip)];

                  printf("Result for sizeof(packet) is: %d", sizeof(packet)) ;
                  exit(0);

                  }

                  And I got as a result:
                  $ ./Test.exe
                  Result for sizeof(packet) is: 31

                  So, I think I have to assume that it's working correctly. The problem is
                  that I'm using Eclipse/CDT and the debugger seems to have problems with
                  this kind of code (with VL Arrays). It showed me the '4' that I was
                  referring to, in the debugging perspective/window from Eclipse... I
                  thought the problem was with the code, but all you made me focus on the
                  test.. I guess I relied too much on the debugger...sigh ..

                  Thanks,

                  FBM
                  [color=blue][color=green]
                  >> Regarding to the other question, I'm using Eclipse + CDT (and the
                  >> compiler is the one that comes with Cygwin which I am using too).[/color]
                  >
                  > Cygwin comes with gcc (version 3.4.4 if you've updated it recently).
                  >[/color]

                  Comment

                  Working...