5 ms·
'\0' is null-terminated NOT zero-terminated, no ? By definition, a string in C is always null-terminated.
by pvdm 16y ago
'\0' is null-terminated NOT zero-terminated, no ?
By definition, a string in C is always null-terminated.
- cperciva 16y ago'\0' is a character, not a string. The string is "\0". Also, C strings are NUL-terminated, not NULL-terminated. (char)(0) is the NUL character; (void * )(0) is the NULL pointer (usually).
- avar 16y agoActually it's the NULL pointer by definition. 0 is always equivalent to NULL in pointer context, even though you're working with some hypothetical crazy system where NULL is actually #define NULL 1337. It's mandated by the standard. If (NULL == 0) isn't true you're not using C.
- cperciva 16y agoWhoops, I forgot the point I was trying to make. NULL is (void * )(0), but the code void * p; memset(&p, 0, sizeof(p)); assert(p == NULL); isn't necessarily valid, since the binary representation of NULL isn't necessarily as a sequence of zeroes -- even though everybody writes code which assumes that it is.
- avar 16y agoYeah, that's unportable. Although I'm not aware of any system where it doesn't work. For the record, regarding 0 in pointer context the C standard has this to say: An integral constant expression with the value 0, or such an expression cast to type void * , is called a null pointer constant. If a null pointer constant is assigned to or compared for equality to a pointer, the constant is converted to a pointer of that type. Such a pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. -- C89/C90 section 3.2.2.3 Pointers The standard then goes on to say that NULL is a macro that's guaranteed to expand to a null pointer constant.
- cperciva 16y agoYeah, that's unportable. Although I'm not aware of any system where it doesn't work. Right. I was considering changing this in FreeBSD last year in order to prevent map-at-NULL kernel exploits, but cooler heads prevailed (and pointed out to me how much code such a change would break).
- nuxi 16y agoHere's the historical list of machines using nonzero null pointers, from comp.lang.c FAQ: http://linuxdude.com/Steve_Sumit/C-faq/q5.17.html http://linuxdude.com/Steve_Sumit/C-faq/q5.17.html
- tedunangst 16y agoThe C standard exclusively uses the phrase "null-terminated" to refer to strings.
- cperciva 16y agoHuh, you're right. I wonder when they changed that.
- jonsen 16y agoNUL is in ASCII an abbreviation for null.
- nuxi 16y agoThey didn't, it's there from at least ANSI C89 (ISO C90): "A byte with all bits set to 0, called the null character, shall exist in the basic execution character set; it is used to terminate a character string literal."
- JoachimSchipper 16y agoI think the rationale is in EBCDIC support; the C standard didn't want to/couldn't mandate ASCII, and therefore could not use the ASCII NUL character. I honestly don't know whether POSIX/SUS mandates ASCII.
- nuxi 16y agoAs far as I understand, no: http://www.opengroup.org/onlinepubs/000095399/xrat/xbd_chap06.html http://www.opengroup.org/onlinepubs/000095399/xrat/xbd_chap0...
- JoachimSchipper 16y agoI read that as "ASCII must be supported, do whatever else you want". But I don't want to spend too much time on this...
- deleted 16y ago[deleted]
- Xurinos 16y agoAs it happens, '\0' translates to 0. Since they are composed of characters, C programmers tend to do the c == '\0' check instead of the shorted c == 0 check, just to make sure everyone knows we are still treating the char like a character in a string; it is just style. char c = 65 is equivalent to and just as legal as char c = 'A' So yes, C strings ARE zero-terminated. In fact, it is a bit weird to say they are null-terminated. It is technically true, given that NULL often translates to 0, but NULL is a pointer value in the same way that zero is a number. For some reason, I vaguely remember some security hack in one OS where NULL went to a special place in memory that was marked as invalid (1, 63, or something), so in that case, NULL was not defined as 0. Since the memory is vague, though, don't quote me on it.
- infinite8s 16y agoWhat people really mean is NUL terminated (NUL is the name of the '\0' character - ASCII value 0x0000). But it probably just mangled some time ago and people write it as NULL.
- nevinera 16y ago>it is a bit weird to say they are null-terminated Yeah, it would be. They're NUL-terminated.
- Xurinos 16y agoUnfortunately, "null-terminated", although incorrect, is widely used. :( http://googlefight.com/index.php?lang=en_GB&word1=%22null-terminated%22&word2=%22nul-terminated%22 http://googlefight.com/index.php?lang=en_GB&word1=%22nul... I hate all the variations of nothing. undef, null, NULL, NIL, NUL...
- tedunangst 16y agoHow can "null-terminated" be incorrect when that is the language used by the C standard?
- 16y ago