Небезопасный фрагмент кода C # с указателями - PullRequest
3 голосов
/ 14 июля 2009

Я наткнулся на следующий фрагмент кода, и мне нужно было предсказать вывод. Мой ответ был 220, но мне сказали, что это неправильно. Может кто-нибудь сказать мне правильный вывод и, пожалуйста, объясните, почему.

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

EDIT: Спасибо всем за разъяснения. Правильный ответ определенно равен 220 тогда и только тогда, когда указанный выше блок кода (код C #, извините, что не упомянул его в вопросе) был объявлен неуправляемым Спасибо за все ваши ответы. Каждый из них был действительно информативным и полезным.

Ответы [ 4 ]

6 голосов
/ 14 июля 2009

Ответ в том, что он не компилируется. Вы получите следующую ошибку:

ошибка CS0214: указатели и буферы фиксированного размера могут использоваться только в небезопасном контексте

Если, однако, вы напишите это:

int ptr1 = 0;

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

Console.WriteLine(ptr1);

Тогда вы действительно получите 220.

Вы также можете создать целый небезопасный метод вместо создания определенных небезопасных блоков:

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

Примечание : вам также необходимо скомпилировать с параметром / unsafe (отметьте «Разрешить небезопасный код» в свойствах проекта в Visual Studio)

Редактировать : Взгляните на Забавный указатель с binky для короткого, забавного, но информативного видео об указателях.

5 голосов
/ 14 июля 2009

Результат равен 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.

Попроси своего учителя дать мне и А;)

3 голосов
/ 14 июля 2009

Я ничего не знаю об указателях в 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);
}
1 голос
/ 14 июля 2009

@ Заки: Вы должны отметить свою сборку, чтобы разрешить небезопасный код, и заблокировать свой небезопасный код следующим образом:

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 и нашел этот , который помог мне создать приведенный выше пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...