Question
First off, here is some code:
int main()
{
int days[] = {1,2,3,4,5};
int *ptr = days;
printf("%u\n", sizeof(days));
printf("%u\n", sizeof(ptr));
return 0;
}
Is there a way to find out the size of the array that ptr
is pointing to
(instead of just giving its size, which is four bytes on a 32-bit system)?
Answer
No, you can't. The compiler doesn't know what the pointer is pointing to.
There are tricks, like ending the array with a known out-of-band value and
then counting the size up until that value, but that's not using sizeof()
.
Another trick is the one mentioned by
Zan, which is to stash the
size somewhere. For example, if you're dynamically allocating the array,
allocate a block one size_t
bigger than the one you need, stash the size in
the there, and return ptr+sizeof(size_t)
as the pointer to the array. When
you need the size, decrement the pointer and peek at the stashed value. Just
remember to free the whole block starting from the beginning, and not just the
array.