dynamic, static array -> sizeof()

A

alternative451

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.
 
L

Lew Pitcher

In said:
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. ------
 
A

Antoninus Twink

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.
 
J

Jens Thoms Toerring

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?
 
K

Keith Thompson

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/>.
 
A

Antoninus Twink

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.
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?
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,954
Messages
2,570,116
Members
46,704
Latest member
BernadineF

Latest Threads

Top