But since you use C to write more optimized code, using one byte for the terminator uses less space than using N bytes to memorize the actual string length, unless you're fine with strings with max length of 255.
In almost all cases, that's a false economy. Okay, in the worst case you use one word instead of one byte for the string. In lots of cases, though, the fact that you want memory regions to be word-aligned means that you will end up allocating the N-1 bytes anyway.
And, in return:
* String equality will take only 2 memory reads if the strings are two different lengths
* String concatenations take O(n_2) time, where n_2 is the length of the second string, instead of O(n_1+n_2).
* Getting the string length is a constant time operation.
* Operations that need to check for buffer overflow can do a single cheap check at the beginning of the operation.
* You don't have the development, debugging and support costs associated with the all-too-common off-by-one and overflow bugs.