tags:

views:

422

answers:

4

Why does n not equal 8 in the following function?

    void foo(char cvalue[8]) {
        int n = sizeof cvalue;
    }

But n does equal 8 in this version of the function:

    void bar() {
        char cvalue[8];
        int n = sizeof cvalue;
    }
+37  A: 

Because you can't pass entire arrays as function parameters in C. You're actually passing a pointer to it; the brackets are syntactic sugar. There are no guarantees the array you're pointing to has size 8, since you could pass this function any character pointer you want.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Nick Retallack
+1  A: 

I think you have a typo in your second example (extra ')'). I'd edit it but I don't have the rep :-).

In the first example, cvalue as passed parameter is in really just a pointer to a character array and when you take the sizeof() of it, you get the size of the pointer. In the second case, where you've declared it as a local variable, you get the size of the the entire array.

dagorym
A: 

The size of the parameter on 32-bit systems will be 4 and on 64-bit systems compiled with -m64 will be 8. This is because arrays are passed as pointers in functions. The pointer is merely a memory address.

hoyhoy
+6  A: 

C and C++ arrays are not first class objects; you cannot pass arrays to functions, they always decay to pointers.

You can, however, pass pointers and references to arrays. This prevents the array bounds from decaying. So this is legal:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}
DrPizza
You deserve more upmods for your clever solution.
Nick Retallack