проблема с использованием указателей в C # - PullRequest
0 голосов
/ 21 августа 2011

Давайте иметь байтовый массив

byte[] Test = { 0, 0, 0, 0 };

Я хочу сделать это:

UInt32* p = &Test[0];
p* = 0xAABBCCDD;

или в скором времени:

(int*)(&Test[0])* = 0xAABBCCDD;

В Delphi я бы сделал:

PUInt32(@Test[0])^ := $AABBCCDD;

, где PUInt32 = ^ Uint32 или typdef PUInt32 = * UInt32 в C #.

Но не знаю, как это работает в C #.

Ответы [ 2 ]

6 голосов
/ 21 августа 2011

Этот тип кода принципиально небезопасен, он побеждает систему типов компилятора.И не будет принят проверяющим.Если вы случайно объявите неверный массив, например, 3 элемента, то вы повредите память и создадите очень сложную для диагностики ошибку.

Однако это также можно сделать безопасно:

byte[] test = BitConverter.GetBytes(0xaabbccdd);

Какой небольшой недостаток, что он создает массив для вас.В обход этого требуется небезопасная версия:

fixed (byte* ptr = test)
{
    *((uint*)ptr) = 0xaabbccdd;
}

, которая требует использования ключевого слова unsafe в объявлении метода и отметьте опцию Project + Properties, Build, «Allow unsafe code».

1 голос
/ 21 августа 2011

вы можете использовать указатели в c # с небезопасным ключевым словом. http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.71).aspx.

Но, как другие предложили, не использовать указатели - намного лучший способ.

вы должны использовать небезопасно:

Приложения реального времени, нам может понадобиться использовать указатели для повышения производительности в таких приложениях. Внешние функции, в не-DLL-библиотеках некоторые функции требуют указатель в качестве параметра, например, API-интерфейсы Windows, которые были написаны на C. Отладка, иногда нам нужно проверять содержимое памяти для целей отладки, или вам может понадобиться написать приложение, которое анализирует другой процесс приложения и память.

http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=351

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