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).