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