gpt4 book ai didi

c# - 为什么这个不安全的代码会抛出 NullReferenceException?

转载 作者:可可西里 更新时间:2023-11-01 08:28:43 25 4
gpt4 key购买 nike

我正在使用不安全的代码解决 Code Golf, 上的问题我发现了一些我无法解释的东西。这段代码:

unsafe
{
int i = *(int*)0;
}

因访问冲突(Segfault)而崩溃,但此代码:

unsafe
{
*(int*)0=0;
}

抛出 NullReferenceException。在我看来,第一个正在执行读取,第二个正在执行写入。一个异常告诉我,CLR 中的某个地方正在拦截写入并在操作系统终止进程之前将其停止。为什么这会发生在写上,而不是在读上?如果我使指针值足够大,它会在写入时出现段错误。这是否意味着 CLR 知道有一 block 内存是保留的,甚至不会尝试写入?那么,为什么它允许我尝试读取该 block ?我在这里完全误解了什么吗?

编辑:

有趣的是:System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0); 给我一个访问冲突,而不是 NullReference。

最佳答案

当然,第一个异常是有道理的——您正在尝试从内存地址 0 读取。第二个异常更有趣一些。 :P 在 C++ 中,有一个名为 NULL 的宏/常量,其值为 0。它用于无效的指针地址 - 很像 C# 中引用类型的空值。由于 C# 引用在内部是指针,因此当您尝试从该地址读取/写入时会发生 NullReferenceException - 地址 NULL 或 0;实际上,从 0 到 64K 的地址在所有进程(在 Windows 中)中都是无效的,以便捕获程序员的错误。确切的异常或错误可能因计算机硬件或 Windows/.NET Framework 版本而略有不同,但您应该会在这两个代码片段中得到一个错误。

至于读写随机地址时的segfault,是由于操作系统对每个进程的隔离。您不能摆弄其他进程的代码或数据 - 至少不能合法。

关于c# - 为什么这个不安全的代码会抛出 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com