C doesn't have a stable ABI, most folks mistake the ABI from OS written in C, with an imaginary C ABI.
Sure that's technically correct, but in practice it means I get a stable ABI :).
Even then, arrays can be encoded and enforced on each side. It would be simpler to enforce this via the abi—but the abi itself does not open issues with array description and access
OS ABIs are usually stable though ;)
Finally someone getting it right though. C doesn't have any ABI per se, compilers need to implement whatever ABI a specific operating system defines (otherwise the language would be pretty useless since it couldn't call into operating system functions).