Weird struct stuff

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 1 18:01:43 PST 2016


On 03/01/2016 05:11 PM, asdf wrote:
 > import std.stdio : writeln;
 >
 > struct foo
 > {
 >      long* bar;
 >
 >      this (long l)
 >      {
 >          long d = l;
 >          bar = &d;

Unfortunately, 'bar' is pointing at the temporary stack-based variable 'd'.

 >      }
 > }
 >
 > int main()
 > {
 >      foo f = foo(12345);
 >      writeln(*f.bar);

That's undefined behavior because f.bar is pointing at a dead object (d).

 >      //writefoo(f);
 >      writeln(*f.bar);
 >
 >      return 0;
 > }
 >
 > void writefoo(foo f)
 > {
 >      writeln(*f.bar);
 > }
 >
 >
 > If I compile this with dmd, I get the obvious output
 > 12345
 > 12345

Yeah, undefined behavior sometimes produces "obvious" outputs. ;)

Ali



More information about the Digitalmars-d-learn mailing list