How to I get pointer to an Array and cast to a void * and back ?
Dennis
dkorpel at gmail.com
Thu Jun 24 14:26:36 UTC 2021
On Thursday, 24 June 2021 at 14:06:11 UTC, seany wrote:
> void f() {
> a[] * rd;
>
> // DO SOME WORK HERE ....
>
> this.dataSet = & rd_flattened;
> rd = cast (a [] *) dataSet;
>
> write("length of rd is : "); writeln((*rd).length); // <---
> this works..
> // do some work on rd
>
> this.dataSet = rd;
> rd = cast (field.rawData [] *) dataSet;
>
> write("length of rd for a second time is : ");
> writeln((*rd).length); // <--- this ALSO works..
> }
>
> Now outside `f`, in the same class, i call :
>
> void f2() {
>
> f();
>
> a[] *aa ;
> aa = cast (a [] *) this.dataSet; // recall dataset is
> public global
> // if i print the address of this.dataSet here, this is the
> same as inside f()
> write("after calling f, count is: ");
> writeln((*aa).length); readln();
> // here the situation completely blows up . the length is
> wrong.
> }
>
> What is causing this issue ?
Your variable `a[] rd_flattened;` is a local variable to function
`f()` allocated on the stack. Stack memory expires as soon as you
return from the function. What `f2()` accesses through your
global variable is a dangling pointer, a pointer to the expired
stackframe of `f()`, which is why the `.length` is garbage.
More information about the Digitalmars-d-learn
mailing list