带指针的不安全C#代码段

时间:2009-07-14 19:07:46

标签: c# pointers

我遇到了以下代码片段,需要预测输出。我的答案是220,但被告知错了。有人能告诉我正确的输出,请解释原因。

using System;
class pointer
{
  public static void Main()
  {
   int ptr1=0;
   int* ptr2=&ptr1;
   *ptr2=220;
   Console.WriteLine(ptr1);
  }
}

编辑: 谢谢大家的解释性答案。当且仅当上面的代码块(这是C#代码,很抱歉没有在问题中提及它)被声明为非托管时,正确答案肯定是220。谢谢你的所有答案。每一个人都非常有信息和帮助。

4 个答案:

答案 0 :(得分:6)

答案是它不能编译。您将收到以下错误:

错误CS0214:指针和固定大小的缓冲区只能在不安全的上下文中使用

但是,如果你这样写:

int ptr1 = 0;

unsafe {
    int* ptr2 = &ptr1;
    *ptr2 = 220;
}

Console.WriteLine(ptr1);

然后你确实会得到220。

您还可以创建一个完整的不安全方法,而不是创建特定的不安全块:

public unsafe void Something() {
    /* pointer manipulation */
}

注意:您还必须使用/ unsafe开关进行编译(在Visual Studio的项目属性中选中“允许不安全的代码”)

修改:请查看Pointer fun with binky,了解有关指针的简短,有趣且内容丰富的视频。

答案 1 :(得分:5)

结果是220,下面是一个C#代码片段来测试它(这里没有C ++)

using System;

internal class Pointer {
    public unsafe void Main() {
        int ptr1 = 0;
        int* ptr2 = &ptr1;
        *ptr2 = 220;

        Console.WriteLine(ptr1);
    }
}

步骤:

  • PTR1被赋值为0
  • PTR2指向PTR1的地址空间
  • PTR2被赋值220(但指向PTR1的地址空间)
  • 因此,当现在请求PTR1时,该值也是220。

请你的老师给我一个A;)

答案 2 :(得分:3)

我对C#中的指针一无所知,但我可以尝试解释它在C / C ++中的作用:

public static void Main()
{
  // The variable name is misleading, because it is an integer, not a pointer
  int ptr1 = 0;

  // This is a pointer, and it is initialised with the address of ptr1 (@ptr1)
  // so it points to prt1.
  int* ptr2 = &ptr1;

  // This assigns to the int variable that ptr2 points to (*ptr2,
  // it now points to ptr1) the value of 220
  *ptr2 = 220;

  // Therefore ptr1 is now 220, the following line should write '220' to the console
  Console.WriteLine(ptr1);
}

答案 3 :(得分:1)

@Zaki:您需要标记程序集以允许不安全的代码并阻止您的不安全代码,如下所示:

public static class Program {
    [STAThread()]
    public static void Main(params String[] args) {
        Int32 x = 2;
        unsafe {
            Int32* ptr = &x;
            Console.WriteLine("pointer: {0}", *ptr);

            *ptr = 400;
            Console.WriteLine("pointer (new value): {0}", *ptr);
        }
        Console.WriteLine("non-pointer: " + x);

        Console.ReadKey(true);
    }
}

老实说,我从未在C#中使用指针(从未使用过)。

我快速Google Search找到了this,这帮助我制作了上面的例子。