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]