dynamic, static array -> sizeof()

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • alternative451@gmail.com

    dynamic, static array -> sizeof()

    Hi, I have just one question :
    how to know the size of an array, i have un little program, i use
    first static, ant i can use sizeof() to know the size,
    but when i put it as paremeter in the function, size of return "1".

    ex
    int tab[10];
    printf("%d",siz eof(tab)/sizeof(int)); // print 10

    int length(int *tab)
    {
    return sizeof(tab)/sizeof(int); // return 1
    }

    dynamic case :
    int *tab = malloc(sizeof(i nt)*10);
    printf("%d",siz eof(tab)/sizeof(int)); // print 1

    Why the result aren't the same ?
    How can i know the size of the array, without save the size ?

    Thanks a lot.
  • Lew Pitcher

    #2
    Re: dynamic, static array -> sizeof()

    In comp.lang.c, alternative451@ gmail.com wrote:
    Hi, I have just one question :
    how to know the size of an array, i have un little program, i use
    first static, ant i can use sizeof() to know the size,
    but when i put it as paremeter in the function, size of return "1".
    >
    ex
    int tab[10];
    printf("%d",siz eof(tab)/sizeof(int)); // print 10
    >
    int length(int *tab)
    {
    return sizeof(tab)/sizeof(int); // return 1
    tab is a pointer to an integer
    So, you've determined that a pointer to an integer is at least one times the
    size of an integer, and less than two times the size of an integer, on your
    platform.
    }
    >
    dynamic case :
    int *tab = malloc(sizeof(i nt)*10);
    printf("%d",siz eof(tab)/sizeof(int)); // print 1
    >
    Why the result aren't the same ?
    Because, you cannot determine the total size of an array from a pointer to
    an element in the array.

    How can i know the size of the array, without save the size ?
    You cannot "know the size of the array" allocated outside of the current
    function "without saving the size"
    >
    Thanks a lot.
    --
    Lew Pitcher

    Master Codewright & JOAT-in-training | Registered Linux User #112576
    http://pitcher.digitalfreehold.ca/ | GPG public key available by request
    ---------- Slackware - Because I know what I'm doing. ------


    Comment

    • Antoninus Twink

      #3
      Re: dynamic, static array -> sizeof()

      On 18 May 2008 at 20:23, alternative451@ gmail.com wrote:
      int *tab = malloc(sizeof(i nt)*10);
      >
      How can i know the size of the array, without save the size ?
      Your implementation probably provides a function for this. For example,
      on the GNU platform you can
      #include <malloc.h>
      and then call malloc_usable_s ize() on your pointer.

      I believe the MicroSoft equivalent is _msize - Jacob will be able to
      confirm or correct this.

      Comment

      • Jens Thoms Toerring

        #4
        Re: dynamic, static array -&gt; sizeof()

        Antoninus Twink <nospam@nospam. invalidwrote:
        On 18 May 2008 at 20:23, alternative451@ gmail.com wrote:
        int *tab = malloc(sizeof(i nt)*10);

        How can i know the size of the array, without save the size ?
        Your implementation probably provides a function for this. For example,
        on the GNU platform you can
        #include <malloc.h>
        and then call malloc_usable_s ize() on your pointer.
        If the OP uses a GNU based platform and for some versions of the
        GNU libc. But if it's available it doesn't tell him/her how many
        elements have been allocated for the array(and it doesn't help
        at all if it's not a dynamically allocated array) but only how
        much memory was set aside for the array, which very well could
        be more than was originallu asked for. So it's absolutely use-
        less for what the OP is looking for.
        I believe the MicroSoft equivalent is _msize - Jacob will be able to
        confirm or correct this.
        Maybe and if the OP uses a Microsoft system. Why can't you stop
        posting stuff that is wrong or maybe wrong or, if you're lucky,
        is correct instead of pointing the people asking not really C
        related questions to the groups where the questions can be really
        answered? You do not help them that way. In the right newsgroup
        they will find enough people that know the correct answers and
        enough people that can intervene if wrong answers are given.

        Or don't you dare to answer questions in a newsgroup were you
        can be sure that enough real experts are taking a look?

        --
        \ Jens Thoms Toerring ___ jt@toerring.de
        \______________ ____________ http://toerring.de

        Comment

        • pete

          #5
          Re: dynamic, static array -&gt; sizeof()

          alternative451@ gmail.com wrote:
          Hi, I have just one question :
          how to know the size of an array, i have un little program, i use
          first static, ant i can use sizeof() to know the size,
          but when i put it as paremeter in the function, size of return "1".
          >
          ex
          int tab[10];
          printf("%d",siz eof(tab)/sizeof(int)); // print 10
          >
          int length(int *tab)
          {
          return sizeof(tab)/sizeof(int); // return 1
          }
          >
          dynamic case :
          int *tab = malloc(sizeof(i nt)*10);
          printf("%d",siz eof(tab)/sizeof(int)); // print 1
          >
          Why the result aren't the same ?
          How can i know the size of the array, without save the size ?
          Save the size, even though you don't want to.

          --
          pete

          Comment

          • Keith Thompson

            #6
            Re: dynamic, static array -&gt; sizeof()

            alternative451@ gmail.com writes:
            how to know the size of an array, i have un little program, i use
            first static, ant i can use sizeof() to know the size,
            but when i put it as paremeter in the function, size of return "1".
            >
            ex
            int tab[10];
            printf("%d",siz eof(tab)/sizeof(int)); // print 10
            >
            int length(int *tab)
            {
            return sizeof(tab)/sizeof(int); // return 1
            }
            >
            dynamic case :
            int *tab = malloc(sizeof(i nt)*10);
            printf("%d",siz eof(tab)/sizeof(int)); // print 1
            >
            Why the result aren't the same ?
            How can i know the size of the array, without save the size ?
            In general, you can't -- so you should save the size if you're going
            to need it later.

            Read section 6 of the comp.lang.c FAQ, <http://www.c-faq.com/>.

            --
            Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
            Nokia
            "We must do something. This is something. Therefore, we must do this."
            -- Antony Jay and Jonathan Lynn, "Yes Minister"

            Comment

            • Richard Heathfield

              #7
              Re: dynamic, static array -&gt; sizeof()

              Jens Thoms Toerring said:
              Antoninus Twink <nospam@nospam. invalidwrote:
              <snip>
              >I believe the MicroSoft equivalent is _msize - Jacob will be able to
              >confirm or correct this.
              >
              Maybe and if the OP uses a Microsoft system. Why can't you stop
              posting stuff that is wrong or maybe wrong or, if you're lucky,
              is correct instead of pointing the people asking not really C
              related questions to the groups where the questions can be really
              answered?
              Because he's a troll. Duh.
              You do not help them that way.
              If he were interested in helping people, he would help them - as you say -
              by pointing them to where the experts hang out (which, for C, is right
              here, but for other stuff it's obviously elsenet). Since he doesn't do
              that, we must assume that he is not interested in helping people, but only
              in attracting flame. Some people are like that.
              Or don't you dare to answer questions in a newsgroup were you
              can be sure that enough real experts are taking a look?
              Presumably that's why he rarely if ever posts topical replies here.

              --
              Richard Heathfield <http://www.cpax.org.uk >
              Email: -http://www. +rjh@
              Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
              "Usenet is a strange place" - dmr 29 July 1999

              Comment

              • Antoninus Twink

                #8
                Re: dynamic, static array -&gt; sizeof()

                On 18 May 2008 at 22:52, Jens Thoms Toerring wrote:
                Antoninus Twink <nospam@nospam. invalidwrote:
                >Your implementation probably provides a function for this. For example,
                >on the GNU platform you can
                >#include <malloc.h>
                >and then call malloc_usable_s ize() on your pointer.
                >
                If the OP uses a GNU based platform and for some versions of the
                GNU libc. But if it's available it doesn't tell him/her how many
                elements have been allocated for the array(and it doesn't help
                at all if it's not a dynamically allocated array) but only how
                much memory was set aside for the array, which very well could
                be more than was originallu asked for. So it's absolutely use-
                less for what the OP is looking for.
                How do you know? The OP's specification was vague, and it might or might
                not be what he was looking for. At least it's a starting point.

                The OP said he had a pointer returned by malloc, but didn't have the
                size he'd passed to malloc() to obtain it to hand. The only portable
                advice is: don't forget the size you passed to malloc(). Of course
                that's good advice, and it's what I usually do myself. But sometimes
                there are good reasons for seeking another solution.

                Here's an example. Suppose we have a function like this:
                struct node *array_copy(str uct node *dst, struct node *src);
                where the arrays are terminated by a sentinel value (e.g.
                last_node->data == NULL). We might want (in a debugging phase - allow
                for the moment that a small number of programmers outside the clc Clique
                actually do have to debug their code) to bounds-check writes to the dst
                list. Or we might want to allow our function to grow the dst list
                dynamically if necessary, and if so return the realloc()d pointer (or
                NULL). In each of these cases, malloc_usable_s ize will be just perfect.

                On the other hand, if the OP is hoping to take a function
                double compute_mean(do uble *x, size_t nelts);
                and replace it with one like
                double compute_mean(do uble *x);
                and calculate the size of the array at runtime, then yes, he'll be
                disappointed (I imagine on every platform - it's not in malloc()'s
                interest to record the memory asked for, only the memory actually
                allocated). But he would surely realize this when he read the
                documentation of the function I suggested might be useful.
                >I believe the MicroSoft equivalent is _msize - Jacob will be able to
                >confirm or correct this.
                >
                Maybe and if the OP uses a Microsoft system. Why can't you stop
                posting stuff that is wrong or maybe wrong or, if you're lucky,
                is correct instead of pointing the people asking not really C
                related questions to the groups where the questions can be really
                answered? You do not help them that way. In the right newsgroup
                they will find enough people that know the correct answers and
                enough people that can intervene if wrong answers are given.
                There are plenty of people here that can intervene if wrong answers are
                given, but apart from Jacob every man Jack of them would rather play
                their silly topicality oneupmanship games than help new posters. I made
                it crystal clear that I'm not sure about the exact function of _msize,
                but I'm 100% sure that using that as a search term will lead the OP to
                useful information if he's using the Windows platform. Why is pointing
                people to other newsgroups any better than pointing them to Google with
                a useful search term?

                Comment

                Working...