在C#中产生分段错误的规范方法是什么?

我对最短的,最新的C#代码感兴趣,它可以可靠地产生段错误 – 理想情况下不需要直接调用任何非托管代码。

你所追求的有点不清楚,但我认为这与迄今为止的任何答案一样好,而且它只是你能得到的最小。

System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);

迈克尔的回答对我不起作用,也许这个案子现在被抓住了。 Marshal.ReadInt32()只给我一个“SystemError:试图读取或写入受保护的内存”。 在Windows上使用.NET 4.5获取各种传递的值。 我使用以下内容但是在Windows和单声道4.0.4.1下我的哪些段错误:

  using System.Runtime.InteropServices; [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void UNMANAGED_CALLBACK(); public void Crash() { var crash = (UNMANAGED_CALLBACK)Marshal.GetDelegateForFunctionPointer((IntPtr) 123, typeof(UNMANAGED_CALLBACK)); crash(); } 

使用/unsafe选项使用csc进行编译:

 class Program { static void Main(string[] args) { unsafe { int *p = null; *p = 5; } } } 

正如上面的评论所指出的那样,在Windows中没有像segfault这样的东西,你在Linux上也没有说过mono。 所以我假设你实际上意味着访问违规。

这是获得一个方法:

 unsafe { int* a = (int*) -4; *a = 0; } 

(必须使用/unsafe选项进行编译。)

我的第一次尝试使用0作为地址,但结果是抛出一个普通的旧NullReferenceException,你可以得到没有不安全的代码。 但负面地址在我的Vista x64盒子上获得AccessViolationException。