What exactly are the String literrals in D and how they work?

Ali Çehreli acehreli at yahoo.com
Sun Aug 15 16:10:02 UTC 2021


Lot's of great information and pointers already. I will try from another 
angle. :)

On 8/14/21 11:10 PM, rempas wrote:

 > So when I'm doing something like the following: `string name = "John";`
 > Then what's the actual type of the literal `"John"`?

As you say and as the code shows, there are two constructs in that line. 
The right-hand side is a string literal. The left-hand side is a 'string'.

 >> Strings are not 0 terminated in D. See "Data Type Compatibility" for
 >> more information about this. However, string literals in D are 0
 >> terminated.

The string literal is embedded into the compiled program as 5 bytes in 
this case: 'J', 'o', 'h', 'n', '\0'. That's the right-hand side of your 
code above.

'string' is an array in D and arrays are stored as the following pair:

   size_t length;    // The number of elements
   T * ptr;          // The pointer to the first element

(This is called a "fat pointer".)

So, if we assume that the literal 'John' was placed at memory location 
0x1000, then the left-hand side of your code will satisfy the following 
conditions:

   assert(name.length == 4);    // <-- NOT 5
   assert(name.ptr == 0x1000);

The important part to note is how even though the string literal was 
stored as 5 bytes but the string's length is 4.

As others said, when we add a character to a string, there is no '\0' 
involved. Only the newly added char will the added.

Functions in D do not need the '\0' sentinel to know where the string 
ends. The end is already known from the 'length' property.

Ali



More information about the Digitalmars-d-learn mailing list