C#如何将数组存储在内存中

时间:2012-06-27 03:34:17

标签: arrays c#-4.0 pointers converter

我想我的主要问题是,只要我不重新初始化(新字节[#])作为参数传递的数组,它会一直有效吗?

static unsafe decimal GetDecimal(byte[] ba)
{
    decimal* decimal_PTR;
    fixed (byte* byte_PTR = &ba[0])
    {
        decimal_PTR = ((decimal*)byte_PTR);
    }
    return *decimal_PTR;
}

我不确定C#如何处理内存中的数组。直到大约一小时前我才知道它们是托管类型。我只是想知道如果我将小数作为byte []传递,它是否总是返回正确的值?您可以提供任何其他信息。

1 个答案:

答案 0 :(得分:2)

在@MJLaukala通过评论澄清之后:

  1. .Net中的数组是一个连续内存块,就像任何其他语言一样。但与C / C ++不同,这个块不仅存储数组的元素,还存储其他“信息”,包括数组的等级和长度。说完这个之后,& ba [0]会将指针返回到数组的第一个元素,你可以安全地将指针递增到最后一个元素。 ba.Length将提供数组中元素的数量。

  2. 现在,如果您确定字节数组完全代表小数,那么您的代码将正常工作。

  3. 十进制内存布局(128位):

    前2个字节为0

    第3个字节包含0到28之间的值,表示10的幂以将96位整数除以产生十进制值

    第4个字节:前7位为零,第8位表示小数符号(1表示负数)

    接下来的12个字节:Decimal的整数部分。