digitalmars.D.learn - Weird struct stuff
- asdf (46/46) Mar 01 2016 import std.stdio : writeln;
- =?UTF-8?Q?Ali_=c3=87ehreli?= (5/30) Mar 01 2016 That's undefined behavior because f.bar is pointing at a dead object (d)...
import std.stdio : writeln;
struct foo
{
long* bar;
this (long l)
{
long d = l;
bar = &d;
}
}
int main()
{
foo f = foo(12345);
writeln(*f.bar);
//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
however, if I uncomment the line writefoo(f);, I get
12345
140724376879320
140724376879320
(the second number changes each time, and appears to be a memory
address)
Stranger still, if I change the constructor to
this (long l)
{
writeln("wtf?");
long d = l;
bar = &d;
}
I get
wtf?
12345
12289
4422212
The second and third numbers don't change
Why does this happen? Were these functional programming guys
right about impure functions having side effects after all?
Mar 01 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 12345Yeah, undefined behavior sometimes produces "obvious" outputs. ;) Ali
Mar 01 2016








=?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com>