我使用下面这段不安全的代码来修改字符串:
public static unsafe void RemoveLastOne(ref string Str1)
{
if (Str1.Length < 1)
return;
int len = Str1.Length - 1;
fixed (char* pCh1 = Str1)
{
int* pChi1 = (int*)pCh1;
pCh1[len] = '\0';
pChi1[-1] = len;
}
}
但是,一段时间后,我的C#程序崩溃并引发异常:
FatalExecutionEngineError: "运行时遇到致命错误。 错误的地址为0x6e9a80d9,在0xcfc线程上。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-Interop或PInvoke的用户封送处理错误,这可能会破坏堆栈。"
如果我将函数“RemoveLastOne”更改为“Str1 = Str1.Remove(Str1.Length - 1);”,程序就可以正常工作。
为什么会出现异常?我该如何正确实现在C#中不安全的字符串更改?
int
存储在-1
索引的char
数组中吗?(char
是 2 字节,int
是 4 字节) - Kieren Johnstone