> ## Content Index
> Fetch the complete content index at: https://blog.skitisu.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# C#中如何替代C/C++中的malloc函数（非托管指针）
- URL: https://blog.skitisu.com/csharp-ru-he-ti-dai--c-malloc-han-shu--fei-tuo-guan-zhi-zhen-/
- Published: 2013-11-15T13:07:01.000Z
- Updated: 2019-06-16T11:29:22.000Z
- Author: SkiTiSu
- Tags: 探索, 编程, C#, #Import 2026-10-21 14:41

这个问题是在我将pi\_agm.c移植到C#时研究的，话不多说，直接进入正题。

> 提示：如果你从来没有用过指针，请先学习指针的含义以及用法。

首先在类名前面加入unsafe关键字，例如

```csharp
unsafe class Program
```

这是由于C#程序托管于.NET平台之上，对指针的操作是有危险性的。并且要在Properties（在解决方案资源管理器中）中勾选“允许不安全代码(F)”。 然后再引用中加入：

```csharp
using System.Runtime.InteropServices;
```

这是非托管代码类。我们就要用到这个类的Marshal.AllocHGlobal与Marshal.FreeHGlobal。下面用一个例子解释一下用法。例如，在C中有以下语句：

```csharp
short *a;
a = (short*)malloc(sizeof(short)*SIZE);
//程序内容
free(a);
```

那么在C#中就要写成：

```csharp
short* a;
IntPtr ap = Marshal.AllocHGlobal(sizeof(short) * SIZE); //申请非托管指针
a = (short*)ap; //将指针地址传给a
//程序内容
Marshal.FreeHGlobal(ap); //释放指针
```

这里就是绕了个弯子。我在移植这个程序时想了各种方法，还有类似于建数组然后传\[0\]的地址的，但是由于.NET有垃圾回收器，而且这个数组的地址会不断的变化，即使使用fixed也还是不尽人意。最后还是推荐大家在C#中尽量不要使用指针。除非用到图片处理这些功能。

//这篇文章写得比较仓促，如果你觉得看不懂或者什么的可以到我微博来找私信我。。。