将C代码移植到不安全的C#时的NullReference?

Sec*_*ret -4 c# pointers nullreferenceexception

我试图在C#中实现Knuth-Morris-Pratt算法,类似于纯C中的实现.

请不要告诉我关于正则表达式和C#中的内存工作.因为,本主题的目的不是C#特性的真实和有用,而是关于C#中指针的工作,以及关于学习这些特性的内存工作.

让我向您展示C#和纯C的实现.

C#http://ideone.com/Ck0G0

Pure C http://ideone.com/FVAzU

我对Pure C中的版本没有任何问题,它没有问题,但没有C#版本.

我在这行上遇到了C#的问题:

    int*[] d = new int*[M * sizeof(int)];
    *d[0] = 0;
Run Code Online (Sandbox Code Playgroud)

我正在捕捉NullReferenceException是通过将0值设置为*d [0]来处理的.

我看过这个参考:

http://msdn.microsoft.com/en-en/library/system.nullreferenceexception.aspx

尝试取消引用空对象引用时引发的异常.

我完全不明白为什么这个东西在我的C#代码中是空的?

我已经定义了*d指向int []数组的指针并使用new []运算符为此分配了内存,为什么它告诉我,如果已经分配了内存,我将取消引用空对象引用?

还有一个关于在C#中明确删除指针的问题.

我知道,它可以用固定的方式完成,但如果我想要这个而不使用这个关键字?

我记得,我必须为此调用Dispose()方法(但是我没有找到这个方法),设置为null并调用GC.Collect().这是正确的方法吗?

谢谢,

最好的祝福!

dtb*_*dtb 6

int *d = (int*)malloc(M * sizeof(int));M int值分配内存.d指向分配的内存.所以它不是一个指针数组,而是一个指向数组的指针.

在C#中,您可以创建一个M int值数组,并在变量中存储对该数组的引用,如下所示:

int[] d = new int[M];
d[0] = 0;
Run Code Online (Sandbox Code Playgroud)

该数组是一个托管对象; 你不需要手动释放它,处理它或调用垃圾收集器.

您在代码中看到的NullReferenceException是由您尝试取消引用指针引起的,该指针由数组创建表达式d[0]初始化null.

  • 不,我写了`int [] d = new int [M];`我的意思是. (2认同)
  • 我曾尝试在没有/不安全的情况下编写,并且在Silverlight和简单的应用程序上使用C#而不使用不安全的东西,我不喜欢它.因为它让我想起了现成的玩具,它可以让你从纯粹的理解中解脱出来的clr-program.我建议更好的方法是学习ILASM/unsafe和.net vm架构. (2认同)