早上好,下午或晚上,
前言:下面的代码没有什么用处。这仅用于解释目的。
在不安全的代码中分配和使用数组“安全模式”有什么问题吗?例如,我应该将我的代码编写为
public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
fixed (uint * first = firstParam, second = secondParam)
{
uint[] Result = new uint[firstParam.Length + secondParam.Length];
for (int IndTmp = 0; IndTmp < firstParam.Length; Result[IndTmp] = *(first + IndTmp++));
for (int IndTmp = 0; IndTmp < secondParam.Length; Result[IndTmp + firstParam.Length] = *(second + IndTmp++);
return Result;
}
}
或者我应该编写一个单独的,不安全的方法,仅接受指针和长度作为参数并在主函数中使用它?
另外,有什么方法可以用
替换分配uint * Result = stackalloc uint[firstParam.Length + secondParam.Length]
这样我就可以使用Result
作为指针,仍然可以将Result
作为uint[]
返回?
非常感谢。
答案 0 :(得分:2)
我认为这样做没有错,虽然如果你使用指针来提高速度,那么使用指针进入Result
也是有意义的。也许是这样的:
public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
uint[] Result = new uint[firstParam.Length + secondParam.Length];
fixed (uint * first = firstParam, second = secondParam, res = Result)
{
for (int IndTmp = 0; IndTmp < firstParam.Length; IndTmp++)
*(res + IndTmp) = *(first + IndTmp);
res += firstParam.Length;
for (int IndTmp = 0; IndTmp < secondParam.Length; IndTmp++)
*(res + IndTmp) = *(second + IndTmp++);
}
return Result;
}
不要返回stackalloc
的任何内容!函数返回后,堆栈上分配的区域将被重用,从而为您提供无效指针。