安全索引不安全代码

时间:2011-03-23 07:42:53

标签: c# unsafe stackalloc

早上好,下午或晚上,

前言:下面的代码没有什么用处。这仅用于解释目的。

在不安全的代码中分配和使用数组“安全模式”有什么问题吗?例如,我应该将我的代码编写为

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[]返回?

非常感谢。

1 个答案:

答案 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的任何内容!函数返回后,堆栈上分配的区域将被重用,从而为您提供无效指针。