如何用C#中的不安全指针解决错误?

时间:2013-08-31 11:21:22

标签: c# pointers unsafe

我的代码如下:

public static unsafe bool ExistInURL(params object[] ob)
    {
        void* voidPtr = (void*) stackalloc byte[5];//Invalid expression term
        *((int*) voidPtr) = 0;
        while (*(((int*) voidPtr)) < ob.Length)
        {
            if ((ob[*((int*) voidPtr)] == null) || (ob[*((int*) voidPtr)].ToString().Trim() == ""))
            {
                *((sbyte*) (voidPtr + 4)) = 0;//Cannot apply operator '+' to operand of type 'void*' and 'int'
                goto Label_004B;
            }
            *(((int*) voidPtr))++;//The left-hand side of an assignment must be a varibale,property or indexer
        }
        *((sbyte*) (voidPtr + 4)) = 1;
    Label_004B:
        return *(((bool*) (voidPtr + 4)));//Cannot apply operator '+' to operand of type 'void*' and 'int'
    }

问题是当我尝试构建或运行项目时,我遇到了很多错误。 有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的代码(已更正):

public static unsafe bool ExistInURL(params object[] ob)
{
    byte* voidPtr = stackalloc byte[5];
    *((int*)voidPtr) = 0;

    while (*(((int*)voidPtr)) < ob.Length)
    {
        if ((ob[*((int*)voidPtr)] == null) || (ob[*((int*)voidPtr)].ToString().Trim() == ""))
        {
            *((sbyte*)(voidPtr + 4)) = 0;
            goto Label_004B;
        }

        (*(((int*)voidPtr)))++;
    }
    *((sbyte*)(voidPtr + 4)) = 1;

Label_004B:
    return *(((bool*)(voidPtr + 4)));
}

而不是void*使用byte*stackalloc返回不得转换,++运算符需要另一组() ...您的反编译器有一些错误:-)你应该告诉作者。

以及代码的未经模糊处理的版本:

public static bool ExistInURL2(params object[] ob)
{
    int ix = 0;
    bool ret;

    while (ix < ob.Length)
    {
        if (ob[ix] == null || ob[ix].ToString().Trim() == string.Empty)
        {
            ret = false;
            goto Label_004B;
        }

        ix++;
    }

    ret = true;

Label_004B:
    return ret;
}

(我离开了goto ......但这不是必要的)

没有goto

public static bool ExistInURL3(params object[] ob)
{
    int ix = 0;

    while (ix < ob.Length)
    {
        if (ob[ix] == null || ob[ix].ToString().Trim() == string.Empty)
        {
            return false;
        }

        ix++;
    }

    return true;
}