dynamic, static array -> sizeof()

Discussion in 'C Programming' started by alternative451@gmail.com, May 18, 2008.

  1. Guest

    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",sizeof(tab)/sizeof(int)); // print 10

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

    dynamic case :
    int *tab = malloc(sizeof(int)*10);
    printf("%d",sizeof(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.
     
    , May 18, 2008
    #1
    1. Advertising

  2. Lew Pitcher Guest

    In comp.lang.c, 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",sizeof(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(int)*10);
    > printf("%d",sizeof(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. ------
     
    Lew Pitcher, May 18, 2008
    #2
    1. Advertising

  3. On 18 May 2008 at 20:23, wrote:
    > int *tab = malloc(sizeof(int)*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_size() on your pointer.

    I believe the MicroSoft equivalent is _msize - Jacob will be able to
    confirm or correct this.
     
    Antoninus Twink, May 18, 2008
    #3
  4. Antoninus Twink <> wrote:
    > On 18 May 2008 at 20:23, wrote:
    > > int *tab = malloc(sizeof(int)*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_size() 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 ___
    \__________________________ http://toerring.de
     
    Jens Thoms Toerring, May 18, 2008
    #4
  5. 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",sizeof(tab)/sizeof(int)); // print 10
    >
    > int length(int *tab)
    > {
    > return sizeof(tab)/sizeof(int); // return 1
    > }
    >
    > dynamic case :
    > int *tab = malloc(sizeof(int)*10);
    > printf("%d",sizeof(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_Keith) <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"
     
    Keith Thompson, May 19, 2008
    #5
  6. On 18 May 2008 at 22:52, Jens Thoms Toerring wrote:
    > Antoninus Twink <> wrote:
    >> Your implementation probably provides a function for this. For example,
    >> on the GNU platform you can
    >> #include <malloc.h>
    >> and then call malloc_usable_size() 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(struct 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_size will be just perfect.

    On the other hand, if the OP is hoping to take a function
    double compute_mean(double *x, size_t nelts);
    and replace it with one like
    double compute_mean(double *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?
     
    Antoninus Twink, May 19, 2008
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Derek
    Replies:
    7
    Views:
    24,413
    Ron Natalie
    Oct 14, 2004
  2. Trevor

    sizeof(str) or sizeof(str) - 1 ?

    Trevor, Apr 3, 2004, in forum: C Programming
    Replies:
    9
    Views:
    661
    CBFalconer
    Apr 10, 2004
  3. Vinu
    Replies:
    13
    Views:
    1,499
    Lawrence Kirby
    May 12, 2005
  4. blufox

    sizeof( int ) != sizeof( void * )

    blufox, May 22, 2006, in forum: C Programming
    Replies:
    2
    Views:
    579
    Joe Smith
    May 22, 2006
  5. Replies:
    46
    Views:
    700
    Shao Miller
    Jan 14, 2013
Loading...

Share This Page