It's possible for the very simple reason that the standard allows it.
So why does the standard allow it? Well, I don't know if there's any rationale behind this. The most likely reason is that it's simply because of backwards compatibility. The C language is literary full of such things.
However, it is considered bad style. So avoid it. And if you compile with warnings enabled, which you shall do, you get this warning:
warning: missing braces around initializer [-Wmissing-braces]
7 | } ar[] = {
| ^
8 | 1,"asd", //should be {1, "asd"},
| { }
9 | 2, "qwe", //should be {2, "qwe"},
| { }
10 | 3, "poi" //should be {3,"poi"}
| {
11 | };
| }
And the philosophy behind C is very different compared to many other languages. One could argue that even if it's bad style to omit the braces, there is not really a reason to forbid omitting them. For instance, it does not cause any ambiguity.