I’ve been given this code:
void f1(int** p1);
void f2(int p2[][]);
void f3(int p3[3][5]);
we can assume that sizeof(int) = 4, sizeof(void*) = 8
and I needed to choose all the correct answers from these answers:
sizeof(p3) == 3*8, sizeof(*p3) == 5*4, sizeof(**p3) == 4sizeof(p2) == 8, sizeof(*p2) == 8, sizeof(**p2) == 4sizeof(p1) == 8, sizeof(*p1) == 8, sizeof(**p1) == 4sizeof(p1) == 8, sizeof(*p1) == 8, sizeof(**p1) == 8sizeof(p3) == 8, sizeof(*p3) == 8, sizeof(**p3) == 4sizeof(p3) == 8, sizeof(*p3) == 5*4, sizeof(**p3) == 4sizeof(p2) == 8, sizeof(*p2) == 8, sizeof(**p2) == 8
so I chose answers no. 2, 3, 6 and I was correct on 3 and 6, but 2 was wrong.
Would be glad for explanation why 2 is wrong, and only 3 and 6 are correct.
>Solution :
This declaration of the parameter
void f2(int p2[][]);
is invalid in C. The right most subscript operator must have an expression.
You could write for example
void f2(int p2[*][*]);
but in this case you may not dereference pointers. Such a declaration may be present only in a function declaration that is not a function definition.
Instead you could write for example
void f2( size_t n, int p2[*][n]);
In this case within the function sizepf( p2 ) will be equal to 8, sizeof( *p2 ) will be equal to n * sizeof( int ) and **p2 will be equal to sizeof( int ).