Как поместить значение в память, выделенную VirtualAlloc в C ++? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь узнать, как использовать функции VirtualAlloc и VirtualFree.

Я прочитал справку MSDN по VirtualAlloc и VirtualFree и понял, как использоватьих (по крайней мере, на базовом уровне).

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

Я попытался написать простое приложение на c ++, которое:
1. Зарезервирует 3000 байтпамять с VirtualAlloc.
2. Передает зарезервированную память.
3. Помещает значения типа char в зафиксированную память.
4. Освобождает память с VirtualFree.

#include<windows.h>

int main() {

 LPVOID ptr = VirtualAlloc(NULL,3000,MEM_RESERVE,PAGE_READWRITE); //reserving memory

 ptr = VirtualAlloc(ptr,3000,MEM_COMMIT,PAGE_READWRITE); //commiting memory

    int i;
    for(i=0; i<3000; i++) {
       ptr[i]= 'a';         //failed attempt to fill the allocated memory with 'a'
    }

 VirtualFree(ptr, 0, MEM_RELEASE); //releasing memory

return 0;
}

Конечно, это дает:

[Warning] pointer of type 'void *' used in arithmetic [-Wpointer-arith]. 
[Error] 'LPVOID {aka void*}' is not a pointer-to-object type.

Поэтому мой вопрос заключается в том, как правильно разместить значение в памяти, выделенной VirtualAlloc в c ++?

Я такженашел этот пример, но он не скомпилировался, и я не смог заставить его работать.

1 Ответ

0 голосов
/ 29 ноября 2018

@ ответ Игоря Тандетника сработал

#include<windows.h>

int main() {
 LPVOID ptr = VirtualAlloc(NULL,3000,MEM_RESERVE,PAGE_READWRITE); //reserving memory
 ptr = VirtualAlloc(ptr,3000,MEM_COMMIT,PAGE_READWRITE); //commiting memory
 memset(ptr, 'a', 3000);
 VirtualFree(ptr, 0, MEM_RELEASE); //releasing memory
return 0;
}

спасибо за ваш ответ.

[править] также пробовал приводить к char *, и это тоже работает.
Еще раз спасибо.

#include<windows.h>
int main() {
 int i;
 LPVOID ptr = VirtualAlloc(NULL,3000,MEM_RESERVE,PAGE_READWRITE); //reserving memory
ptr = VirtualAlloc(ptr,3000,MEM_COMMIT,PAGE_READWRITE); //commiting memory  
char* char_ptr = static_cast<char*>(ptr);

for(i=0;i<3000;i++){
    char_ptr[i] = 'a';  
} 

VirtualFree(ptr, 0, MEM_RELEASE); //releasing memory

return 0;
}

[править] [2]
Обработка возвращаемых значений как @DavidHeffernan sugested:

#include<windows.h>  
#include<iostream>
using namespace std; 

int main() {
size_t in_num_of_bytes,i;
cout<<"Please enter the number of bytes you want to allocate:";
cin>>in_num_of_bytes;                                      

LPVOID ptr = VirtualAlloc(NULL,in_num_of_bytes,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE); //reserving and commiting memory

if(ptr){
    char* char_ptr = static_cast<char*>(ptr);
    for(i=0;i<in_num_of_bytes;i++){ //write to memory
        char_ptr[i] = 'a';
    }

    for(i=0;i<in_num_of_bytes;i++){ //print memory contents
        cout<<char_ptr[i];
    }

    VirtualFree(ptr, 0, MEM_RELEASE); //releasing memory    
}else{
    cout<<"[ERROR]:Could not allocate "<<in_num_of_bytes<<" bytes of memory"<<endl; 
}

return 0;
} 
...