Не может взять адрес данного выражения указатель C # - PullRequest
5 голосов
/ 22 февраля 2011

Рассмотрим следующий код в небезопасном контексте:

string mySentence = "Pointers in C#";

fixed (char* start = mySentence) // this is the line we're talking about
{
    char* p = start;

    do
    {
        Console.Write(*p);
    }
    while (*(++p) != '\0');
}

Console.ReadLine();

Это хорошо работает.

Согласно http://msdn.microsoft.com/en-us/library/f58wzh21(v=VS.100).aspx я смогу заменить строку, помеченную

fixed(char* start = &mySentence[0])

Но, к сожалению, VS выдает мне следующую ошибку.

Невозможно получить адрес данного выражения

Ошибка на моей стороне?

VS.NET 2010 Premium.

Ответы [ 3 ]

12 голосов
/ 22 февраля 2011

Ошибка на моей стороне?

Нет;ошибка в документации, на которую вы ссылаетесь.В нем говорится:

fixed (char* p = str) { /*...*/ }  // equivalent to p = &str[0]

Комментарий неверный;как вы правильно заметили, нелегально брать адрес внутренней части строки.Допустимо использовать только адрес внутренней части массива.

Допустимыми инициализаторами для фиксированного оператора являются:

  • Оператор адреса &, примененный к ссылке на переменную,
  • Массив
  • Строка
  • Буфер фиксированного размера.

str[0] не является ссылкой на переменную, поскольку сначала строкаэлементы не являются переменными, и, во-вторых, потому что это вызов функции индексации, а не ссылка на переменную.И при этом это не массив, строка или буфер фиксированного размера, поэтому он не должен быть законным.

Я поговорю с менеджером документации и посмотрим, сможем ли мы это исправитьв более позднем пересмотре документации.Спасибо за то, что обратили на это мое внимание.

ОБНОВЛЕНИЕ: Я поговорил с одним из менеджеров документации, и они сообщили мне, что мы только что завершили крайний срок для следующего запланированного пересмотра документации.Предложенное изменение пойдет в очередь на доработку после следующего.

2 голосов
/ 22 февраля 2011

Это не работает, потому что вы пытаетесь получить доступ к строке. Если вы измените свой код на:

char[] mySentence = "Pointers in C#".ToCharArray();

fixed (char* start = &mySentence[0])
{
    char* p = start;

    do
    {
        Console.Write(*p);
    }
    while (*(++p) != '\0');
}

Console.ReadLine();

все будет работать нормально.

0 голосов
/ 22 февраля 2011

mySentence [0] возвращает одиночный символ только для чтения, вы не можете получить указатель на него.

Использование:

fixed(char* start = &mySentence)

вместо.

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