【问题标题】:C# CS0019 IntPtrC# CS0019 IntPtr
【发布时间】:2012-12-23 05:07:44
【问题描述】:

我遇到了一个C#源代码的sn-p如下

int* ptr = ...;
int  w = ...;

int* ptr3 = ptr + (IntPtr)w;

CS0019: Operator '+' cannot be applied to operands of type 'int*' and 'System.IntPtr'

我猜这段代码试图将 ptr 地址向前移动 w,这取决于操作系统。这是正确的,我怎样才能编译这段代码?

【问题讨论】:

  • 旁注:如果你不知道代码应该做什么,也许你不应该写它......你真的需要使用不安全的代码和指针吗?

标签: c# .net compiler-errors intptr


【解决方案1】:

如果您想使用指针,您必须将代码包装在 unsafe { } 中并在项目属性中翻转允许不安全开关

unsafe 
{
  //pointer code here
}

【讨论】:

  • 未打开此选项会生成完全不同的错误消息。
【解决方案2】:

不,它的语法不正确。目前还不清楚您要完成什么,所以只是在这里猜测。如果要将指针向前移动“w”整数,请使用:

  int* ptr3 = ptr + w;

由于 int 是 4 个字节,因此将 4*w 添加到指针值。这相当于将 ptr3 视为指向 int 数组的指针,其中 w 是数组元素的偏移量。还有C语言对待指针的方式。

如果您打算将地址增加 w,然后避免使用 IntPtr,C# 语言禁止在 IntPtr 上使用 + 运算符,即使 CLR 允许这样做。你需要做一些转换:

  int* ptr3 = (int*)((byte*)ptr + w);

【讨论】:

  • 我试图将指针地址增加 w。由于 int 类型在 x86 上是 4 个字节,在 64 位操作系统上是 8 个字节,我只是想确保代码在任何一台机器上都能正常工作。
  • 一个 int 在任何架构上都是 4 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多