2016-09-12 9 views
-1

Я не могу записать в блок виртуальной памяти, несмотря на то, что он помечен как PAGE_READWRITE. Это исключение сгенерировано во время выполнения:C++ Невозможно записать в виртуальную память, несмотря на то, что она помечена как прочитанная и записываемая

Exception thrown at 0x722E4AE9 (vcruntime140d.dll) in ConsoleApplication.exe: 0xC0000005: Access violation writing location 0x00000000. 

Вот код:

#include <iostream> 
#include <windows.h> 

int main() { 
    char* memblock; 

    memblock = new char[8] { 0, 1, 2, 3, 4, 5, 6, 7 }; 

    LPVOID virtual_memory_area = VirtualAlloc(NULL, 8, MEM_PHYSICAL, PAGE_READWRITE); 
    memcpy(virtual_memory_area, memblock, 8); 
} 
+4

В документации говорится, что при возникновении ошибки VirtualAlloc возвращает null и устанавливает ошибку. Возможно, это помогает вам там. – Hayt

+1

Соблюдайте, что говорит Хейт. Я искренне сомневаюсь, что «местоположение 0x00000000» - это чтение и запись в вашей системе. –

ответ

3

Параметр VirtualAllocflAllocationType должен иметь один из MEM_COMMIT, MEM_RESERVE, MEM_RESET или MEM_RESET_UNDO. MEM_PHYSICAL необязательный флаг для flAllocationType.

У вас есть только MEM_PHYSICAL, следовательно VirtualAlloc не работает.

1

Если посмотреть на ошибки, вы пытаетесь записать на пустой указатель, следовательно, за исключением. Причина в том, что VirtualAlloc не удалось и вернул null.