extern __gshared const(char)* symbol fails

Edgar Huckert edgar.huckert at huckert.com
Sat Sep 1 16:34:36 UTC 2018


On Friday, 31 August 2018 at 17:50:17 UTC, Steven Schveighoffer 
wrote:
...
> When you use const char* in D, it's expecting a *pointer* to be 
> stored at that address, not the data itself. So using it means 
> segfault. The static array is the correct translation, even 
> though it leaks implementation details.
>
> In C, it's working because C has the notion of a symbol being 
> where an array starts. D has no concept of a C array like that, 
> every array must have a length. So there is no equivalent you 
> can use in D -- you have to supply the length.
>

I think this is only correct for dynamic arrays. For static 
arrays I have the impression that it works exactly as in C, i.e. 
the address of the array is the address of the first array 
element. See this simple code:

import std.stdio;
import std.array;

void main()
{
   // static array
   ulong [4] ulArr1 = [0,1,2,3];
   ulong *p1 = ulArr1.ptr;
   ulong *p2 = &(ulArr1[0]);
   ulong [4] *p3 = &ulArr1;
   writeln("same pointers: ", cast(void *)p1 == cast(void *)p2);
   writeln("same pointers: ", cast(void *)p3 == cast(void *)p2);
   writeln("");
   // dynamic array
   ulong [] ulArr2 = [0,1,2,3];
   p1 = ulArr2.ptr;
   p2 = &(ulArr2[0]);
   ulong [] *p5 = &ulArr2;
   writeln("same pointers: ", cast(void *)p1 == cast(void *)p2);
   writeln("same pointers: ", cast(void *)p5 == cast(void *)p2);
}   // end main()

This produces (with dmd):

same pointers: true
same pointers: true

same pointers: true
same pointers: false



More information about the Digitalmars-d-learn mailing list