String[] pointer to void* and back
anonymous via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Sep 18 14:53:10 PDT 2014
On Thursday, 18 September 2014 at 21:35:50 UTC, seany wrote:
> Yes, thank you, I corrected that.
>
> However, if this v is a member of a class, like
>
>
>
> import std.stdio;
> import std.conv;
> import core.vararg;
>
> struct S
> {
> void *v;
> }
>
> class C
> {
>
>
> S* sx = new S;
>
> void dothings()
> {
> string[] ss = ["1", "2", "4"];
ss is a local variable. I.e., ss.ptr and ss.length are on the
stack.
> string[] *s;
> void *vv;
>
> s = &ss;
> vv = s;
vv now holds a pointer to the stack.
>
> sx.v = vv;
Here, the pointer to the stack escapes the function. Don't do
that! When dothings returns, its portion of the stack becomes
unoccupied. Other functions will re-use it and stomp over the
data. The escaped pointer then points to some completely
unrelated data.
>
> }
>
> }
>
>
> void main() {
>
> C c = new C;
> c.dothings();
> writeln("done");
>
> string[]* sh;
> sh = cast(string[]*)c.sx.v;
> writeln(sh); // upto this, works, the same pointer
> as set in
> // c.dothings(), checked with write
> instructions
>
> string[] si = *sh;
> writeln(si);
> }
>
>
>
> and then casted back, then i notice that it does not work.
> Wondering why.
More information about the Digitalmars-d-learn
mailing list