2016-11-18 3 views
0

Я пытаюсь выделить 10000 таблиц страниц, но не могу их скомпилировать. Я получаю следующую ошибку.Неверное преобразование из 'void *' в char (*)?

error: invalid conversion from 'void*' to 'char (*)[(<anonymous> + 1)]' [-fpermissive] 
    char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0); 

Мой код, как указано ниже.

int main(int argc, char **argv) { 
    unsigned long physical_addr; 
    uint8_t *buf; 
    unsigned long virtual_addr; 
    char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0); 
    int i; 
    for (i = 0; i * sizeof(*my_memory) < 10000; i++) { 
     my_memory[i][0] = 1; 
    } 
} 

Не знаете, как это решить. Пожалуйста помоги.

+1

Вы не можете присвоить массив ... –

+1

'my_memory' должен быть [указатель на массив] (HTTP: //cdecl.ridiculousfish. com /? q = char +% 28 * my_memory% 29% 5B4096% 5D) – Kninnug

+6

Вы используете компилятор C++ случайно? – aschepler

ответ

1

Вы не можете назначить массив из указателя. Если вы сделаете my_pointer голым указателем, это задание будет работать, но вы потеряете возможность выполнять двойное индексирование, которое вы делаете в коде, который вы разместили; вместо этого вам нужно будет разработать схему индексирования, которая позволит вам использовать 1D-массив. Ваш код будет выглядеть так:

int main(int argc, char **argv) { 
    unsigned long physical_addr; 
    uint8_t *buf; 
    unsigned long virtual_addr; 
    char *my_memory = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0); 
    int i; 
    for (i = 0; i < 10000; i++) { 
     my_memory[PAGE_SIZE * i] = 1; 
    } 
} 

(Обратите внимание, что я вроде выводя, что это последняя петля должна была сделать, моя интерпретацию, что вы хотели, чтобы установить первые байты каждую «страницу» в 1)

+1

Поскольку @Kninnug уже исправил меня, это не массив, а указатель на массив. –

+1

OP явно хочет двойного индексирования. Заменяя его одиночными, рассчитанными индексами, но я думаю, что вы можете сделать лучше. – anatolyg

+0

Благодарим вас за ответ. Я действительно искал решение, которое использует двойную индексацию. –

0

Вы должны использовать кастинг в соответствующем типе, поскольку на самом деле вы используете язык C++.

В C, этот код будет работать:

char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(...); 

Здесь my_memory является указателем на массив char с. C имеет встроенное преобразование от void* к любому указателю, поэтому код является законным в C и делает то, что вы хотите.

Если вы хотите, чтобы это сработало на C++, вы должны добавить бросок.

Тип my_memory: char (*)[sysconf(_SC_PAGESIZE)]. Таким образом, отливка будет выглядеть следующим образом:

char (*my_memory)[sysconf(_SC_PAGESIZE)] = static_cast<char (*)[sysconf(_SC_PAGESIZE)]>(mmap(...)); 

или, в менее многословной манере:

auto my_memory = static_cast<char (*)[sysconf(_SC_PAGESIZE)]>(mmap(...)); 

или, если вы хотите, чтобы сделать код как можно более коротким (менее читаемым):

auto my_memory = (char (*)[sysconf(_SC_PAGESIZE)])mmap(...); 

Некоторые люди предпочитают иметь typedef для сложных типов, таких как указатели на массивы. Если вы хотите идти по этому пути, вот синтаксис:

using my_array_ptr_type = char (*)[sysconf(_SC_PAGESIZE)]; 
auto my_memory = static_cast<my_array_ptr_type>(mmap(...)); 
+0

Спасибо @anatolyg за ваше решение .... Я получил его сейчас. –

Смежные вопросы