将 C 代码移植到不安全的 C# 时的空引用

本文关键字:引用 不安全 代码 | 更新日期: 2023-09-27 18:36:28

我正在尝试在 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# 代码中为空?

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

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

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

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

谢谢

此致敬意!

将 C 代码移植到不安全的 C# 时的空引用

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