On 9/3/20 1:47 PM, Curious wrote:
Given the following:

=====a======
void main(string[] args)
{
     FILE* fp = fopen(args[1].ptr, "r");
     if (!fp) throw new Exception("fopen");
}

=====b======
void main(string[] args)
{
     FILE* fp = fopen(args[1].dup.ptr, "r");
     if (!fp) throw new Exception("fopen");
}

Why does a fail but b succeed?

try `toStringz`:
```D
import std.string : toStringz;

void main(string[] args)
{
     FILE* fp = fopen(args[1].toStringz, "r");
     if (!fp) throw new Exception("fopen");
}
```
The reason is that args are D strings (that contains no terminating 0) but `fopen` gets C string (null terminated) so your `a` variant fails because the filename becomes wrong as there is no terminating 0. Your `b` variant works in fact accidentally because after duplication in new memory after filename 0 appears due to random reason (for example all that memory area zeroed by allocator).

Reply via email to