在C#中使用指针时出现问题

时间:2011-08-21 10:37:18

标签: c# pointers

让我们有一个字节数组

byte[] Test = { 0, 0, 0, 0 };

我想这样做:

UInt32* p = &Test[0];
p* = 0xAABBCCDD;

或者很快:

(int*)(&Test[0])* = 0xAABBCCDD;

在Delphi中,我会这样做:

PUInt32(@Test[0])^ := $AABBCCDD;

其中PUInt32 = ^ Uint32或在C#中的typdef PUInt32 = * UInt32。

但不知道它在C#中是如何工作的。

2 个答案:

答案 0 :(得分:6)

这种代码从根本上说是不安全的,它会破坏编译器的类型系统。并且验证者不会接受。如果您不小心声明数组错误,例如3个元素,那么您将损坏内存并产生一个非常难以诊断的错误。

然而,这也可以安全地完成:

byte[] test = BitConverter.GetBytes(0xaabbccdd);

它为您创建阵列的轻微缺点。绕过它需要不安全的版本:

fixed (byte* ptr = test)
{
    *((uint*)ptr) = 0xaabbccdd;
}

这要求您在方法声明中使用 unsafe 关键字并勾选Project + Properties,Build,“Allow unsafe code”选项。

答案 1 :(得分:1)

你可以在c#中使用指向unsafe关键字的指针。 http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.71).aspx

但正如其他建议不使用指针更好的方法。

你应该使用unsafe:

实时应用程序,我们可能需要使用指针来增强此类应用程序的性能。 外部函数,在非.NET DLL中,某些函数需要指针作为参数,例如用C语言编写的Windows API。 调试时,有时我们需要检查内存内容以进行调试,或者您可能需要编写一个分析另一个应用程序进程和内存的应用程序。

http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=351