Why are string literals zero-terminated?
awishformore
awishformore at gmail.com
Tue Jul 20 09:05:47 PDT 2010
Am 20.07.2010 15:38, schrieb Lars T. Kyllingstad:
> On Tue, 20 Jul 2010 13:26:56 +0000, Lars T. Kyllingstad wrote:
>
>> On Tue, 20 Jul 2010 14:59:18 +0200, awishformore wrote:
>>
>>> Following this discussion on announce, I was wondering why string
>>> literals are zero-terminated. Or to re-formulate, why only string
>>> literals are zero-terminated. Why that inconsistency? What's the
>>> rationale behind it? Does anyone know?
>>
>> So you can pass them to C functions.
>
> Note that even though string literals are zero terminated, the actual
> string (the array, that is) doesn't contain the zero character. It's
> located at the memory position immediately following the string.
>
> string s = "hello";
> assert (s[$-1] != '\0'); // Last character of s is 'o', not '\0'
> assert (s.ptr[s.length] == '\0');
>
> Why is it only so for literals? That is because the compiler can only
> guarantee the zero-termination of string literals. The memory following
> a string in general could contain anything.
>
> string s = getStringFromSomewhere();
> // I have no idea where s is coming from, so I don't
> // know whether it is zero-terminated or not. Better
> // make sure.
> someCFunction(toStringz(s));
>
> -Lars
Hey.
Yes, that indeed makes a lot of sense.
I didn't actually try those asserts because I'm currently not on a dev
machine, but what you point out basically is the behaviour I was hoping for.
Thanks for clearing this up.
/Max
More information about the Digitalmars-d-learn
mailing list