提取char值时遇到问题,在struct []中使用unsafe char *

时间:2015-10-19 20:15:34

标签: c# arrays string character unsafe

在这段代码中,我试图模拟一个包含结构数组的任务, ......获得尽可能多的吞吐量是不安全的。

问题是我在调用fucntion并对结果进行itterating时 显示不同的字符,但在GetSomeTs()的范围内,这很好。

所以在返回之前我测试其中一个元素并打印正确的值。

这是测试结构。

public unsafe struct T1
{
    public char* block = stackalloc char[5];<--will not compile so the process will be done within a local variable inside a method
}

public unsafe struct T1
{
    public char* block;
}

    static unsafe T1[] GetSomeTs(int ArrSz)
    {
        char[] SomeValChars = { 'a', 'b', 'c', 'd', 'e' };
        T1[] RtT1Arr = new T1[ArrSz];

        for (int i = 0; i < RtT1Arr.Length; i++)
        {
            char* tmpCap = stackalloc char[5];

            for (int l = 0; l < 5; l++)
            {
                SomeValChars[4] = i.ToString()[0];
                tmpCap[l] = SomeValChars[l]; 
            }


            RtT1Arr[i].block = tmpCap;//try 1
            //arr[i].block = &tmpCap[0];//try 2
        }
           // here its fine
        Console.WriteLine("{0}", new string(RtT1Arr[1].block)); 
        return RtT1Arr;
    }

但在其他地方使用它来打印垃圾。

void Main()
{
     T1[] tstT1 = GetSomeTs(10);

        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("{0}", new string(tstT1[i].block));//,0,5, Encoding.Default));
        }
}

1 个答案:

答案 0 :(得分:1)

当您使用stackalloc分配内存时,内存仅存在,直到函数返回已分配内存为止。您正在返回一个指向不再允许访问的内存的指针。

很难推荐修复,因为不清楚你想要实现什么。或许,您应该使用托管char[]

Encoding.Default.GetBytes非常慢,所以无论如何这可能是你的热点,其余的则不那么重要。 i.ToString()也很慢并且产生垃圾。如果您在perf之后,则始终停止创建不需要的对象,例如SomeValChars。创建一次并重复使用。