arrays - C# 数组如何存储在内存中

标签 arrays c#-4.0 pointers converters

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

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[] 传递,它总是返回正确的值吗?我们非常感谢您提供的任何其他信息。

最佳答案

@MJLaukala 通过评论进行澄清后:

  1. .Net 中的数组是一个连续的内存块,就像任何其他语言一样。但与 C/C++ 不同的是,该 block 不仅存储数组的元素,还存储其他“信息”,包括数组的排名和长度。话虽如此, &ba[0] 将返回指向数组第一个元素的指针,您可以安全地递增指针直到最后一个元素。 ba.Length 将提供数组中元素的数量。

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

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

前2个字节为0

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

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

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

关于arrays - C# 数组如何存储在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11219041/

相关文章:

c - 从 scanf 到结构的输入值

c - 在c中动态分配二维数组错误

java数组线程安全

c# - 有效且高效地管理许多 TCP 连接

c# - Generic 基类继承自 Generic Interface

c - 如何拥有一个使用指针 ptr 来读取和打印有关书籍结构的内容的程序?

arrays - MATLAB cell2mat 唯一误差元胞数组

javascript - 提取 Javascript 对象中的嵌套值

c# - 在编程中处理属性

c - c 中 const char*[] 的指针赋值