我正在尝试在C#中实现Knuth-Morris-Pratt算法,类似于纯C中的实现。
请不要告诉我有关正则表达式以及在C#中无法使用内存的情况。 因为,本主题的目的不是C#特性的真实和有用,而是关于C#中指针的工作,以及有关学习这些特性的内存工作。
让我向您展示C#和纯C的实现。
我对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()。这是正确的方法吗?
谢谢,
最诚挚的问候!
答案 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
。