Hi,

I was doing some tests and this code:

import std;

struct S{
    string[] s = ["ABC"];
    int i = 123;
}

void foo(bool b, string str){
    S t1;

writeln("t1.s: ", t1.s, ", t1.s.ptr: ", t1.s.ptr, " t1.i: ", t1.i);

    if(b){
        t1.s[0] = str;
    }else{
        t1.s = [str];
    }

    t1.i = 456;
    S t2;

writeln("t1.s: ", t1.s, ", t1.s.ptr: ", t1.s.ptr, " t1.i: ", t1.i);

writeln("t2.s: ", t2.s, ", t2.s.ptr: ", t2.s.ptr, " t2.i: ", t2.i);
    writeln("");
}

void main(){
    foo(false, "DEF");
    foo(true, "DEF");
    foo(false, "XYZ");
}

Outputs:

t1.s: ["ABC"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["DEF"], t1.s.ptr: 7EFC725E6000 t1.i: 456
t2.s: ["ABC"], t2.s.ptr: 56421C6D7010 t2.i: 123

t1.s: ["ABC"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["DEF"], t1.s.ptr: 56421C6D7010 t1.i: 456
t2.s: ["DEF"], t2.s.ptr: 56421C6D7010 t2.i: 123

t1.s: ["DEF"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["XYZ"], t1.s.ptr: 7EFC725E6020 t1.i: 456
t2.s: ["DEF"], t2.s.ptr: 56421C6D7010 t2.i: 123

As you can see:

    t1.s = [str];

Just changed generated a new address only for t1.s, on the other hand:

    t1.s[0] = str;

Changed the value pointed by S.s entirely (The other "instance" t2 since points to the same address now has the new value too).

Is this intended?

Matheus.

Reply via email to