Как мне сохранить указатель на элемент в массиве, который возвращается из функции? - PullRequest
1 голос
/ 17 октября 2011

У меня большой массив. Я передаю этот массив функции, которая возвращает указатель на определенный элемент в массиве. Или, по крайней мере, так и должно быть. Вместо этого указатель, который я получаю после возврата функции, равен 0x0000. Что?!

int* getPtr(int[] array)
{
    //there is guarenteed no indexOutOfBounds...
    fixed(int* p = array[4])
    return p;
}


Main()
{
    int[] massive = new int[10];
    int* p = getPtr(massive);
    Console.WriteLine((int)p);        //... address is 0... arg
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2011

Пиннинг, выполняемый fixed, длится только до конца контролируемого оператора (или блока). Таким образом, ваш код эквивалентен:

fixed(int* p = array[4]) {
    return p;
}

После того, как ваша функция вернется, закрепление больше не действует. С документация :

После выполнения кода в операторе все закрепленные переменные отменяются и подлежат сборке мусора. Поэтому не указывайте на эти переменные вне фиксированного оператора.

0 голосов
/ 17 октября 2011

Сначала я бы попытался дать массиву несколько значений.Если вы просто напишите указатель на область памяти, в которой нет данных, то нет никаких реальных гарантий того, что вы получите.

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