C++ 如何将VirtualAlloc在c+中分配的值放入内存中+;?

C++ 如何将VirtualAlloc在c+中分配的值放入内存中+;?,c++,winapi,memory-management,virtualalloc,C++,Winapi,Memory Management,Virtualalloc,我正在尝试学习如何使用VirtualAlloc和VirtualFree函数 我已经阅读了msdn关于和的参考资料,并了解如何使用它们(至少在基本层面上) 问题是我找不到如何将值放入分配的内存中 尝试编写一个简单的C++应用程序: 1.使用VirtualAlloc保留3000字节的内存。 2.提交保留内存。 3.将字符类型值放入提交的内存中。 4.使用VirtualFree释放内存 #include<windows.h> int main() { LPVOID ptr = Vir

我正在尝试学习如何使用VirtualAlloc和VirtualFree函数

我已经阅读了msdn关于和的参考资料,并了解如何使用它们(至少在基本层面上)

问题是我找不到如何将值放入分配的内存中

尝试编写一个简单的C++应用程序: 1.使用VirtualAlloc保留3000字节的内存。
2.提交保留内存。
3.将字符类型值放入提交的内存中。
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;
}
我的问题是如何正确地将值放入VirtualAlloc在C++中分配的内存?


我也找到了这个例子,但它没有编译,我无法让它工作。

@Igor Tandetnik的回答起了作用

#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;
}
#包括
int main(){
LPVOID ptr=VirtualAlloc(NULL,3000,MEM_RESERVE,PAGE_READWRITE);//保留内存
ptr=VirtualAlloc(ptr,3000,MEM_COMMIT,PAGE_READWRITE);//提交内存
memset(ptr,'a',3000);
VirtualFree(ptr,0,MEM_RELEASE);//释放内存
返回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;
}
#包括
int main(){
int i;
LPVOID ptr=VirtualAlloc(NULL,3000,MEM_RESERVE,PAGE_READWRITE);//保留内存
ptr=VirtualAlloc(ptr,3000,MEM_COMMIT,PAGE_READWRITE);//提交内存
char*char_ptr=静态_cast(ptr);

对于(i=0;i
char*char\u ptr=static\u cast(ptr);char\u ptr[i]='a';
或者,对于您的特定示例,
memset(ptr'a',3000)
virtualalloc和winapi在这里根本不相关。很难相信您链接到的代码没有编译。忽略返回值总是一个非常糟糕的主意。不要忽略错误检查。为什么要在单独的步骤中保留和提交?为什么不使用标准库分配器。@David Heffernan您正确地认为忽略返回值是一个糟糕的主意在我了解代码的核心工作原理之前,对它们进行排序。我将reserve和commit分开,因为我测试的这两个函数在分开时和在一起时工作相同,因此为了便于区分,我将它们分开使用。链接中的代码在u try和u上给出错误,除了(PageFaultExceptionFilter(GetExceptionCode()))我不使用标准库分配器,因为我想对内存进行更直接的控制,例如,能够拥有大量连续的指针空间,并在不影响内存分配的情况下分配释放部分(我主要关心的是碎片)内存的其余部分(如堆)。@David Heffernan是的,我确实应该检查错误。这是下一步要做的,我只是尝试一下熟悉一下。谢谢你的建议。
#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;
}
#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;
}