转义对局部变量的引用

时间:2015-12-28 19:21:46

标签: d

我是D语言的新手。在尝试创建一个返回字节数组的简单函数时,我在尝试返回值时遇到错误。我应该从函数中返回一个局部变量吗?

在返回行上,我收到错误Error: escaping reference to local c

我的代码:

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;
}

2 个答案:

答案 0 :(得分:5)

byte[]byte[some_size]是两种不同的类型。 byte[some_size]是一个静态数组,在使用时会被复制,而byte[]是指向其值的切片或动态数组。

当您尝试return c时,由于返回值是一个切片,它会尝试获取指向c的指针...这是一个在函数返回时不再存在的本地值。如果编译好了,它会在运行时给你乱码或崩溃!

您需要修复该类型。 c {em>不应为byte[a.sizeof]。它应该只是一个简单的byte[]。要设置数组的大小,请使用.length代替.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

这将做你想要的。

答案 1 :(得分:4)

更惯用的D代码示例:

ubyte[] xor(in ubyte[] a, in ubyte[] b)
{
    assert(a.length == b.length);

    auto c = new ubyte[a.length];

    return c[] = a[] ^ b[];
}