As far as I know,
sizeof() operator gives the size of a certain variable or type. The fact that it is an operator means that it is applied at compile-time and not runtime.
Since you passed a 3-byte wide var, it gives 3.
On the other hand, strlen gives the length of a string. A string must be NULL terminated (i.e., it is an array of chars where its last character is NULL (which is '\0')). Since strlen cannot find a '\0' in your string, it goes reading bytes in memory (a[0], a[1], a[2], a[3]) until it finds a '\0'. In your particular case at the time you ran your program, a[16] happened to be a '\0'. So there it stopped and said 16 as the length.
You might wonder why your program is accessing a[15] if you declared it to have only a[0], a[1] and a[2]. But that's how the thing works: Welcome to C language and low-level programming.