#include <stdio.h>
int main(void){
char array[20];
printf( "\nSize of array is %d\n", sizeof(array) ); //outputs 20
printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}
Code above gives 20
for sizeof(array)
and 4
for sizeof(&array[0])
.
What I knew was instead of giving array as a argument, its first element can be passed. Shouldn't they give same output as 20? and why &array[0]
gives 4 as result? char is stored in 1 byte as far as I know?
In the expression sizeof array
, array
is not converted to a pointer type.
C11, § 6.3.2.1 Lvalues, arrays, and function designators
Except when it is the operand of the
sizeof
operator, the_Alignof
operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.
Therefore, its type is char[20]
, not char *
. The size of this type is sizeof(char) * 20 = 20
bytes.
C11, § 6.5.3.4 The
sizeof
and_Alignof
operatorsThe
sizeof
operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand.
&array[0]
type is char *
. That's why the sizeof(&array[0])
gives the same result as sizeof(char *)
(4 bytes on your machine).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With