我是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;
}
答案 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[];
}