【问题标题】:having issues when extracting char values, using unsafe char* in a struct []在提取 char 值时遇到问题,在结构 [] 中使用不安全的 char*
【发布时间】:2015-10-19 20:15:34
【问题描述】:

在这段代码中,我试图模拟一个填充结构数组的任务, ...获得尽可能多的输出是不安全的。

问题是我在调用函数并迭代结果时 显示不同的字符,但在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));
        }
}

【问题讨论】:

    标签: c# arrays string character unsafe


    【解决方案1】:

    当您使用stackalloc 分配内存时,该内存只存在于您分配它的函数返回之前。您正在返回一个指向不再允许访问的内存的指针。

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

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

    【讨论】:

    • 首先感谢您的回答,如果我尝试在退出之前将结果复制到 manged char[] 中,通过数组复制我将失去快速执行此操作的整个概念,因为这将是另一项任务花费时间所以最好从一开始就使用 char[]?,此代码的目的是尽可能快地初始化具有值的结构数组,空闲类型将是字符串,我试图获得与普通 List
    • 你明白stackalloc的方法因为方法返回时内存没了就没有机会工作了吗?
    • 我愿意,这是设计的规则,但如果你复制块则不是 ..say T1.block 是 char[] 并且我懒得去像函数 GetSomeTs() 中的非托管代码都一样,但最后我会以某种方式(需要研究将char*转换为char[])因此复制tmpCap的内容......它将维持GetSomeTs()之外的价值,尽管我通过所有这些获得了什么进程 vs char[]= char[]string = string,才是真正的问题
    • 所以,问问自己你要复制到哪里。在这里使用 stackalloc 只会通过引入一个不必要的中间缓冲区来减慢您的速度。
    • 您不能从指针转换为数组。数组是一个完整的对象,它也存储一个长度。它不仅仅是一个指针。正确的方法是首先分配一个数组,填充它并返回它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-08-14
    • 2015-06-29
    • 2021-12-13
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    相关资源
    最近更新 更多