array length using pointers

arrays, c++, pass-by-reference, pointers

Solution

Array length can be calculated using *(&arr+1)-arr

Only if `arr` is actually an array. Within `func`, `arr` is a pointer, so this dereferences a random word of memory to give undefined behavoiur.

There is no way to tell the size of an array given just a pointer to its first element. You could pass the array by reference:

template <size_t N>
void func(int (&arr)[N]) {
    cout<<ARRAY_SIZE(arr)<<endl;
    cout<<N<<endl;               // equivalent, and less weird
}

Using the same technique, we can reimplement `ARRAY_SIZE` without resorting to the preprocessor or any bizarre pointer arithmetic:

template <size_t N>
size_t ARRAY_SIZE(int (&arr)[N]) {
    return N;
}

Problem

Array length can be calculated using `*(&arr+1)-arr` which then simplifies to `(&arr)[1]-arr` which further simplifies to `1[&arr]-arr`. But when the length is calculated in a function different from where memory allocation has been done, wrong results are computed. For instance, ``` #include <iostream> #define ARRAY_SIZE(arr) (1[&arr]-arr) using namespace std; void func(int *arr) { cout<<ARRAY_SIZE(arr)<<endl; } int main() { int arr[]={1,2,3,4,5}; cout<<ARRAY_SIZE(arr)<<endl; func(arr); } ``` This gives the output: ``` 5 8 ``` What accounts for such strange behaviour?

Original source

Related problems