Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Escaping reference to local variable

Tags:

d

I am new to the D language. While trying to create a simple function that returns a byte array, I run into errors when trying to return my value. Is there a different way I am supposed to return a local variable from a function?

On the the return line, I get error Error: escaping reference to local c

My code:

byte[] xorFixed(byte[] a, byte[] b){
   if (a.sizeof != b.sizeof) return null;
   byte[a.sizeof] c;
   for (int i = 0; i < a.sizeof; i++)
   {
      c[i] = (a[i] ^ b[i]);

   return c;
}
like image 613
Matt Avatar asked Feb 15 '26 13:02

Matt


1 Answers

byte[] and byte[some_size] are two different types. A byte[some_size] is a static array that is copied around when used and a byte[] is a slice or dynamic array that points to its values.

When you try to return c, since the return value is a slice, it tries to take a pointer to c... which is a local value that ceases to exist when the function returned. If this compiled, it would give you gibberish or a crash at runtime!

You need to fix the type. c should not be byte[a.sizeof]. It should just be a plain byte[]. To set the size of an array, use .length instead of .sizeof.

if (a.length != b.length) return null; // changed sizeof -> length
byte[] c; // changed type
c.length = a.length; // this sets the length of c to match a
for (int i = 0; i < a.length; i++) // changed sizeof to length

That will do what you want.

like image 191
Adam D. Ruppe Avatar answered Feb 19 '26 01:02

Adam D. Ruppe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!