奇怪的结构行为

Xor*_*-el 4 c# struct

我写了一个小代码片段来演示这个问题.问题是当我声明一个具有Layout.Explicit状态的结构时,它会根据另一个值为该结构的字段分配一个未定义的值.仅在使用Layout.Explicit状态时才会出现此问题.没有代码很难解释,所以这里是一个简短的样本.

using System.Runtime.InteropServices;
namespace ConsoleStruct
{
    class Program
    {
        [StructLayout(LayoutKind.Explicit)]
        struct TestStruct
        {
            [FieldOffset(0)]
            public double dbl;
            [FieldOffset(0)]
            public ulong uu;
        }

        public static void SimpleMethod()
        {
            TestStruct st;
            st.uu = 0;
            st.dbl = 5000.0;
            Console.WriteLine(st.uu.ToString()); // ==> uu becomes 4662219572839972864 
                                                 //instead of 0 :(
                                                 // it looks like the value of uu is dependent on the 
                                                 //value assigned to dbl
            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            SimpleMethod();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么会这样.使用VS 2013.谢谢.

Hen*_*man 8

看起来uu的值取决于分配给dbl的值

是的.因为你给了它们相同的偏移量,它们在内存中占据相同的位置(在结构内部).

[FieldOffset(...)]允许您手动布局字段,并可以使它们重叠.一些非托管API需要这样做.

请注意,当您尝试使用引用字段(如字符串)重叠某些内容时,您将获得运行时异常.只有在仅使用值类型执行此操作时,才能维持内存安全.