Possible Duplicate:
Calculating size of an array
This question has been asked before, but I want to confirm it. Let’s say I have the following C++ function:
#include <stdio.h>
#include <stdin.h>
#define length(a) sizeof(a)/sizeof(a[0])
int main()
{
double c[] = {1.0, 2.0, 3.0};
printf("%d\n", getLength(c));
return 0;
}
int getLength(double c[]) { return length(c);}
This should return the wrong value because size of will return the size of the pointer as opposed to the size of the array being pointed at. This:
template<typename T, int size>
int length(T(&)[size]){return size;}
I know it works directly, but I want to know if I can somehow call it indirectly i.e. via a helper function. I understand that two possible alternatives are to either store the length of the array in a separate slot or use a vector, but what I want to know is:
Given a function getLength:
getLength(double arr[])
{
...
}
Is there a way to compute the length of arr without passing any more information?
The template version would work. Who said it will not work?
This is correct. It will return the length of the array. You just need to call this function directly. It seems you want to call this function from
getLength(). Don’t do that, because the way you’ve writtengetLengthfunction is equivalent to this:There is absolutely no difference between your written
getLength()and the above version. That is, once you call this function, (or your function), the array is already decayed into a pointer to double. You’ve already lost thesizeinformation with the decay of the array (which is why this is calleddecaying of array). So you should NOT call this function, instead call thelength()function directly..However, there is little problem with
length()as well. You cannot use this function where const-expression is needed, as such:So the solution would be this:
Now you can write: