sizeof array clarification

后端 未结 6 2235
不知归路
不知归路 2020-12-06 18:34

I am studying for a final tomorrow in C, and have a question regarding the sizeof operator.

Let\'s say the size of an int is 32 bits and a

6条回答
  •  無奈伤痛
    2020-12-06 18:55

    This is sort of an asymmetry in the C syntax. In C it's not possible to pass an array to a function, so when you use the array syntax in a function declaration for one of the parameters the compiler instead reads it as a pointer.

    In C in most cases when you use an array in an expression the array is implicitly converted to a pointer to its first element and that is exactly what happens for example when you call a function. In the following code:

    int bar[] = {1,2,3,4};
    foo(bar);
    

    the array is converted to a pointer to the first element and that is what the function receives.

    This rule of implict conversion is not however always applied. As you discovered for example the sizeof operator works on the array, and even & (address-of) operator works on the original array (i.e. sizeof(*&bar) == 4*sizeof(int)).

    A function in C cannot recevive an array as parameter, it can only receive a pointer to the first element, or a pointer to an array... or you must wrap the array in a structure.

    Even if you put a number between the brackets in the function declaration...

    void foo(int x[4])
    {
        ...
    }
    

    that number is completely ignored by the compiler... that declaration for the compiler is totally equivalent to

    void foo(int *x)
    {
        ...
    }
    

    and for example even calling it passing an array with a different size will not trigger any error...

    int tooshort[] = {1,2,3};
    foo(tooshort);  /* Legal, even if probably wrong */
    

    (actually a compiler MAY give a warning, but the code is perfectly legal C and must be accepted if the compiler follows the standard)

    If you think that this rule about arrays when in function arguments is strange then I agree, but this is how the C language is defined.

提交回复
热议问题