• ptr<T > types a pointer that is either null or points to a single object of type T.
• array_ptr<T > types a pointer that is either null or points to an array of T objects. The array width is defined by a bounds expression, discussed below.
• nt_array_ptr<T > is like array_ptr<T > except that the bounds expression defines the minimum array width— additional objects may be available past the upper bound, up to a null terminator."
It's not hard to do this if you retrofit checkable array types. I've proposed that myself.[1] The trouble is, you've created another C variant, one with checking. There are many of those, and none have caught on.
[1] http://www.animats.com/papers/languages/safearraysforc43.pdf