-4

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

请不要告诉我关于 Regex 和在 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# 代码中为空?

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

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

我知道,它可以用fixed来完成,但是如果我想要这个而不使用 this 关键字呢?

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

谢谢,

此致!

4

1 回答 1

6

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

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

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

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

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

于 2012-06-08T04:04:06.883 回答