4 ms·
There is no "loose convention". A C string is a null terminated string of non-null bytes. That's the definition. Working with them in memory-unconstrained envir
by junon 4y ago
There is no "loose convention". A C string is a null terminated string of non-null bytes. That's the definition. Working with them in memory-unconstrained environments is unnecessarily hard.
- magicalhippo 4y agoThere is indeed just convention. The language defines string constants similar to what you say[1] (an array of characters, terminated by a null character), but in the language itself there's no way to declare that a function takes a string rather than a pointer to a character. Alternatively if you work with a fixed-sized character array, there's nothing separating it from "just" an array of characters that are not null terminated. So that strcmp expects a string rather than a pointer to a character is just convention. In languages which actually has strings as a concrete concept, like say Pascal and derivatives, you can actually differentiate between those two cases. [1]: https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#String-Constants https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#...
- int_19h 4y agoThat means that the strings aren't properly reflected in the type system. But the existence of string literals with a very definite in-memory layout means that it's not just a convention even so.
- magicalhippo 4y agoBut you can't use those string literals in any way without relying on convention.
- int_19h 4y agoThat was my point. Although you can, actually - since literals themselves are array-typed, you can sizeof them to get the character count without relying on null termination. It's even possible to get a non-null-terminated literal if the target array type is not large enough to fit null, e.g.: char s[3] = "foo"; // not null-terminated!
- giantrobot 4y ago> character count Byte count.
- int_19h 4y agoIf you want to be pedantic, "an object declared as type char is large enough to store any member of the basic execution character set". It doesn't actually have to be a byte. In practice, in C context, character == char == byte. Other concepts have to use different names to avoid confusion with the language spec.
- junon 4y agoIn C a 'char' is a 'byte', if we're going to be extra pedantic.