From the D Blog -- Interfacing D with C: Strings Part One

Steven Schveighoffer schveiguy at gmail.com
Mon May 24 16:16:53 UTC 2021


On 5/24/21 10:02 AM, Mike Parker wrote:
> The latest post in the D and C series dives into the weeds of D and C 
> strings: how they're implemented, when you need to NUL-terminate your D 
> strings and when you don't, and how the storage of literals in memory 
> allows you to avoid NUL termination in one case you might not have 
> considered and another case that you shouldn't rely on but can in 
> practice with the current compilers.
> 
> There are at least two more posts worth of information to go into on 
> this topic, but everything in this post is enough to cover many use 
> cases of D to C string interop.
> 
> The blog:
> https://dlang.org/blog/2021/05/24/interfacing-d-with-c-strings-part-one/
> 
> Reddit:
> https://www.reddit.com/r/programming/comments/njyf76/interfacing_d_with_c_strings_part_one/ 
> 

Nice article!

Note that there is a huge pitfall awaiting you if you use `toStringz`: 
garbage collection. You may want to amend the article to identify this 
pitfall.

And I'm not talking about requiring `@nogc`, I'm talking about the GC 
collecting the data while C is still using it.

In your example:

```d
puts(s1.toStringz());
```

This leaves a GC-collectible allocation in C land. For `puts`, it's 
fine, as the data is not used past the call, but in something else that 
might keep it somewhere not accessible to the GC, you'll want to assign 
that to a variable that lasts as long as the resource is used.

-Steve


More information about the Digitalmars-d-announce mailing list