7

Possible Duplicate:
Sizeof array passed as parameter

I am being stupid with this sizeof operator in c++, do you have any idea why it is 4 and 12 ?

 void function (int arg[]) {
        cout<<sizeof(arg)<<endl; // 4
    }

    int main ()
    {
        int array[] = {1, 2, 3};
        cout<<sizeof array<<endl; // 12
        function (array);
       return 0;
    }
2

4 Answers 4

24

In main, the name array is an array so you get the size in bytes of the array with sizeof. However, an array decays to a pointer when passed to a function, so you get sizeof(int*) inside the function.

Be aware that taking an argument in the form of T arg[] is exactly the same as taking the argument as T* arg. So your function is the exact equivalent of

void function(int* arg) {
    cout << sizeof(arg) << endl;
}
Sign up to request clarification or add additional context in comments.

Comments

4
 void function (int arg[]) // or void function (int arg[N])

is equivalent to

 void function (int *arg)

thus,

sizeof(arg) == sizeof(int*)

If you intend to pass array itself, then C++ offers you to pass it by reference:

void function (int (&arg)[3])
              //   ^^^ pass by reference

Now,

sizeof(arg) == sizeof(int[3])

Comments

0

Your program below is similar to the next one.

void function (int arg[]) {
    cout<<sizeof(arg)<<endl; // 4
}

Program below prints the size of pointer.

void function (int *arg) {
    cout<<sizeof(arg)<<endl; // 4
}

Comments

-1

Arrays are simply pointers to an arbitrary amount of memory. If you do sizeof(array) it will return the size of a pointer - 4 bytes on 32 bit systems, and 8 bytes on 64 bit systems (if the program is compiled as 64 bit).

This is the same reason that you have to null-terminate your strings in c/c++ - to denote the end of the array.

Simply put, you have the keep track of the size of your arrays yourself. If you allocate an array of 40 bytes, you have to make sure you never access the array above the 40th index (ie. array[39]).

Hope this helps.

8 Comments

If arrays are simply pointers, how come inside main it prints 12?
I can't be 100% sure, but my guess is because your array is static. It's size is determined at compile-time, unlike dynamic memory. Sizeof() may work on static arrays, but i can assure you it won't work on arrays that are allocated dynamically during runtime.
arrays are not simply pointers.
@xaxxon Yes, they are when it comes right down to it. An array is a pointer to an area of memory containing a sequence of a specified datatype.
@Gogeta70 An array is a language construct which is distinct from and behaves differently than a pointer. A pointer is also a language construct. Both may contain a memory address, but neither is "simply" the other and both have unique behaviors within the language.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.