Possible Duplicate:
How to find the sizeof( a pointer pointing to an array )
I understand that the sizeof operator is evaluated and replaced with a constant at compile time. Given that, how can a function, being passed different arrays at different points in a program, have it's size computed? I can pass it as a parameter to the function, but I'd rather not have to add another parameter if I don't absolutely have to.
Here's an example to illustrate what I'm asking:
#include <stdio.h>
#include <stdlib.h>
#define SIZEOF(a) ( sizeof a / sizeof a[0] )
void printarray( double x[], int );
int main()
{
double array1[ 100 ];
printf( "The size of array1 = %ld.\n", SIZEOF( array1 ));
printf( "The size of array1 = %ld.\n", sizeof array1 );
printf( "The size of array1[0] = %ld.\n\n", sizeof array1[0] );
printarray( array1, SIZEOF( array1 ) );
return EXIT_SUCCESS;
}
void printarray( double p[], int s )
{
int i;
// THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE
// SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO.
printf( "The size of p calculated = %ld.\n", SIZEOF( p ));
printf( "The size of p = %ld.\n", sizeof p );
printf( "The size of p[0] = %ld.\n", sizeof p[0] );
for( i = 0; i < s; i++ )
printf( "Eelement %d = %lf.\n", i, p[i] );
return;
}
You must either
You answered your own question. It's computed at compile-time, so how can 'sizeof p' possibly have more than one value during runtime?
Passing the length as a parameter is a fine solution, otherwise you can make sure your arrays always end with some special value (like strings and the null byte).
There is no magic solution. C is not a reflective language. Objects don't automatically know what they are.
But you have many choices:
Function parameters never actually have array type. When the compiler sees
or even
it converts either one to
So
sizeof(p)
issizeof(double*)
. And yes, you'll have to pass the size as a parameter.You can use a sentinel value which is the way strings are dealt with. The drawback is that you have to iterate over the entire array to find it's size.
For example, when you have a string such as:
What you actually have is an array of length 7, with the seventh spot being a null terminating char '\0' which serves to indicate the end of the array / string.
Another way you could do it is to create a struct which consists of a size followed by the array.
If your array is null terminated then you can iterate through the array and find the last value. Many string operators in C work that way
Otherwise you don't have much choice.
sizeof will return the size of p, which is a pointer and will equals to your int size