.init property for char[] type
Steven Schveighoffer
schveiguy at yahoo.com
Tue Sep 22 10:40:12 PDT 2009
On Tue, 22 Sep 2009 09:53:52 -0400, Justin Johansson
<procode at adam-dott-com.au> wrote:
> Daniel Keep Wrote:
>
>> > Big difference if you pass char[] variable .ptr to a C function.
>
>> In general, if you pass a string to a C function you should send it
>> through toStringz first. If you don't, you're just begging for
>> segfaults.
>
> Agreed .. fair enough.
>
> Actually I'm more interested in the semantics for default initialized
> char[].
> Does it have exactly the same semantics as an empty string (in general D
> or runtime library, Phobos et. al. context)?
A null string *is* an empty string, but an empty string may not be a null
string.
The subtle difference is that the pointer points to null versus some data.
A non-null empty string:
- May be pointing to heap data, therefore keeping the data from being
collected.
- May reallocate in place on appending (a null string always must
allocate new data on append).
It's a difficult concept to get, but an array is really a hybrid type
between a reference and a value type. The array is actually a value type
struct with a pointer reference and a length value. If the length is
zero, then the pointer value technically isn't needed, but in subtle
cases, it makes a difference. When you copy the array, the length behaves
like a value type (changing the length of one array doesn't affect the
other), but the array data is referenced (changing an element of the array
*does* affect the other).
I think plans are to make the array a full reference type, and leave
slices as these structs (in D2). This probably will clear up a lot of
confusion people have.
I hope this helps...
Oh, and BTW, you can pass string literals to C functions, but *not* char[]
variables. Always pass them through toStringz. It generally does not
take much time/resources to add the zero.
-Steve
More information about the Digitalmars-d
mailing list