On Tuesday, 25 October 2022 at 16:52:48 UTC, Salih Dincer wrote:
On Tuesday, 25 October 2022 at 13:51:30 UTC, Andrey Zherikov
wrote:
Does the second piece of code shows a bug or my expectation is
not correct (and why if so)?
This is a bug:
```d
void main()
{
struct B
{
struct A
{
int i = 10;
}
A[] a = [A.init];
}
B[2] b;
assert(b[0].a[0].i == 10);
assert(b[1].a[0].i == 10);
b[0].a[0].i = 1;
assert(b[0].a[0].i == 1); // ok...
assert(b[1].a[0].i == 1); // must be 10 !!!
}
```
It's not a bug. They're pointing to the exact same instance of
`A` in memory:
```d
void main()
{
struct B
{
struct A
{
int i = 10;
}
A[] a = [A.init];
}
B[2] b;
assert(b[0].a.ptr is b[1].a.ptr);
}
```
As explained in [Adam's reply][1], what happens here is that
there is a single, global `A[]` allocated at compile time, which
is shared between all instances of `B.init`. It's the same as if
you'd written
```d
struct B
{
struct A
{
int i = 10;
}
static A[] globalArray = [A.init];
A[] a = globalArray;
}
```
[1]:
https://forum.dlang.org/post/[email protected]