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

时间:2012-06-08 03:59:41

标签: c# pointers nullreferenceexception

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

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

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

C#http://ideone.com/Ck0G0

纯C http://ideone.com/FVAzU

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

我在C#中遇到问题:

    int*[] d = new int*[M * sizeof(int)];
    *d[0] = 0;

我正在处理处理NullReferenceException ,将0值设置为* d [0]。

我已阅读此参考文献:

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

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

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

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

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

我知道,可以使用修复来完成,但如果我想要这个而不使用此关键字?

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

谢谢,

最诚挚的问候!

1 个答案:

答案 0 :(得分:6)

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

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

int[] d = new int[M];
d[0] = 0;

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

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