Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parameters in the sizeof operator in C

I understand that when we use sizeof operator on an array name, it gives the total size of the array in bytes. For example

int main(int argc, const char * argv[]) {
    int a[][5] = {
        {1,2,3,4,5},
        {10,20,30,40,50},
        {100,200,300,400,500}
    };

    int n=sizeof(a);
    printf("%d\n",n);

}

It gives 60 as output for 15 elements of the array. But when I write

int n=sizeof(*a);

It gives 20 as the output that is the size of the first row while *a is the base address of the 0th element of the 0th row, and its type is a pointer to an integer. And a points to the first row itself. Why is this happening?

like image 581
Gaurav Mishra Avatar asked Jan 02 '23 02:01

Gaurav Mishra


1 Answers

*a is row 0 of a, and that row is an array of five int.

In most expressions, an array is automatically converted to a pointer to its first element. Thus, when you use *a in a statement such as int *x = *a;, *a is converted to a pointer to its first element. That results in a pointer to int, which may be assigned to x.

However, when an array is the operand of a sizeof operator, a unary & operator, or an _Alignof_ operator, it is not converted to a pointer to its first element. Also, an array that is a string literal being used to initialize an array is not converted to a pointer (so, in char foo[] = "abc";, "abc" is used as an array to initialize foo; it is not converted to a pointer).

like image 195
Eric Postpischil Avatar answered Jan 04 '23 16:01

Eric Postpischil