Вопрос

Функция CreateFileMapping возвращает указатель на файл с отображением в памяти, и я хочу обработать это отображение в памяти как массив.

Вот что я в принципе хочу сделать:

char Array[] = (char*) CreateFileMapping(...);

За исключением того, что, очевидно, я не могу просто взмахнуть руками и объявить, что указатель теперь является массивом.

Ребята, у вас есть какие-нибудь идеи, как я могу это сделать?Я не хочу копировать значения, на которые указывает указатель, в массив, потому что это будет использовать слишком много памяти при работе с большими файлами.

Большое спасибо,

Это было полезно?

Решение

Тебе не нужно.Вы можете индексировать указатель, как если бы это был массив:

char* p = (char*)CreateFileMapping(...);
p[123] = 'x';
...

Другие советы

В C/C++ указатели и массивы — это не одно и то же.

Но в вашем случае для ваших целей они есть.

У вас есть указатель.

Вы можете дать ему нижний индекс.

Например.указатель char* указывает на начало «привет»

указатель[0] — это первый символ «h»

указатель[1] — второй символ «е»

Так что просто относитесь к этому так, как вы думаете о массиве.

"В C / C ++ указатели и массивы - это не одно и то же". верно, но имя переменной для массива совпадает с именем указателя const (это из моей старой черной книги Coriolis C ++, насколько я помню).А именно:

char carray[5];
char caarray2[5];
char* const cpc = carray;    //can change contents pointed to, but not where it points

/*
  cpc = carray2;    //NO!! compile error
  carray = carray2; //NO!! compile error - same issue, different error message
*/

cpc[3] = 'a';  //OK of course, why not.

Надеюсь, это поможет.

Но чем указатель отличается от массива?Что случилось с

char *Array = (char*)CreateFileMapping(...);

Вы можете лечить Array более или менее так же, как вы будете относиться к массиву с этого момента.

Вы можете использовать приведение в стиле C:

char *p = (char*)CreateFileMapping(...);
p[123] = 'x';

Или предпочтительный актерский состав:

char *p std::reinterpret_cast<char*>(CreateFileMapping(...));
p[123] = 'x';

Я тоже искал этот ответ.Что вам нужно сделать, это создать свой собственный тип массива.

    static const int TickerSize = 1000000;
    int TickerCount;
    typedef char TickerVectorDef[TickerSize];

Вы также можете привести указатель к этому новому типу.В противном случае вы получите «Ошибка компилятора C2440».Однако это должен быть массив фиксированного размера.Если вы используете его только как указатель, фактическая память не выделяется (за исключением 4–8 байт для самого указателя).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top