18

Why does n not equal to 8 in the following function?

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

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

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

4 Answers 4

49

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) 
Sign up to request clarification or add additional context in comments.

Comments

15

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); } 

2 Comments

You deserve more upmods for your clever solution.
Just need to note that the template example is C++, not C. C does not support reference types.
1

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.

Comments

0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.