Arrays in C are often passed around as pointers to the first element, in which case you can no longer get a correct answer with this pattern. This is the most common scenario where it stops to apply.
Sometimes the sized array form is actually never available, as with dynamically allocated memory. The correct pattern for all those cases is to pass around the size from where it's known, along with the pointer. One can also use a sentinel element to solve some problems without knowing the size explicitly.