C# 更改缓冲区的分配大小';t更改程序的输出

C# 更改缓冲区的分配大小';t更改程序的输出,c#,buffer,fixed,C#,Buffer,Fixed,到 我希望有一些超出边界的异常,但程序仍然在运行,没有错误。在示例中,“Christian Troy”的长度超过1。有人能解释一下原因吗?您的代码没有崩溃,因为您将p声明为指针(byte*p)。因此,p[i]=(字节)s[i]不是通过数组类访问缓冲区,而是直接操作内部内存。 您的指令被转换为类似于(伪代码)的内容 内存(addressof(p)+(i*sizeof(byte))=(byte)s[i] 这种行为是不可预测的,取决于内存的布局。特别是,在您的情况下,在变量存储之后,您正在覆盖分配给进


我希望有一些超出边界的异常,但程序仍然在运行,没有错误。在示例中,“Christian Troy”的长度超过1。有人能解释一下原因吗?

您的代码没有崩溃,因为您将
p
声明为指针(
byte*p
)。因此,
p[i]=(字节)s[i]
不是通过
数组
类访问缓冲区,而是直接操作内部内存。 您的指令被转换为类似于(伪代码)的内容

内存(addressof(p)+(i*sizeof(byte))=(byte)s[i]

这种行为是不可预测的,取决于内存的布局。特别是,在您的情况下,在变量存储之后,您正在覆盖分配给进程的一部分内存。由于您正在处理的字节数很少,因此不会出现任何异常

如果你写了一个很长的字符串,比如说5000个字符,你会试图破坏这个段,你会看到异常

试试这个:


newunsaceclass(新字符串('a',5000))

因为这是非托管代码,所以不会出现任何异常。相反,你会有不可预测的行为。没有像托管代码中那样的边界检查嗨,我如何才能更改为使用托管代码?谢谢不使用
不安全的
相关功能。例如,指针。。。(纯托管代码不使用
不安全的
变量、类、结构等)感谢您的帮助没有问题,但是这并不能回答为什么代码在您将其更改为缓冲区[1]后仍然可以工作,我也对它的解释感兴趣…Hi Pier,非常感谢您的友好解释,与您所说的完全相同。我感谢你的帮助!
using System;

namespace Page189
{
    unsafe struct UnsafeUnicodeString
    {
        public short Length;
        public fixed byte Buffer[30]; // Allocate block of 30 bytes, I change the 30 to 1, expected to have some outofboundary exception, but nothing happens

    unsafe class UnsafeClass
    {
        UnsafeUnicodeString uus;

        public UnsafeClass(string s)
        {
            uus.Length = (short) s.Length;
            fixed (byte* p = uus.Buffer)


                for (int i = 0; i < s.Length; i++)
                {
                    p[i] = (byte) s[i];
                    Console.Write((char)p[i]);//this line is added by myself
                }
            }
        }

        class Test
        {
            static void Main()
            {
                new UnsafeClass("Christian Troy");
            }
        }
    }
}
public fixed byte Buffer[30]
public fixed byte Buffer[1]