文章内容
之前写的一点windows下编程的内容,每一篇都会设立几个目标(题目来自国外某大学),并写一个可运行的实例出来用于熟悉各种API,并把相关的API的官方MSDN文档附上,大伙可自行参考学习相关API用法
进程默认堆中分配内存的示例一共有三个部分,该部分为第三部分,其余部分传送如下:
(一)
(二)
目标
原版
You should implement a function, which performs the following actions:
- Allocate the memory region (buffer) in the address space of the process using the VirtualAlloc function sufficient to store 10 elements of DWORD type. The type of memory allocation (the third parameter of the VirtualAlloc function) should be set in MEM_COMMIT | MEM_RESERVE. The type of access to the memory region (the fourth parameter of the VirtualAlloc function) must be set to PAGE_READWRITE.
- Get the size of the allocated memory region using the VirtualQuery function and display it on the screen.
- Fill the buffer elements as follows: the value of each i-th element is 4ii.
- Display the contents of the buffer on the screen.
- Free the allocated memory region using the VirtualFree function. The operation type (the third parameter of the VirtualFree function) must be set to MEM_RELEASE.
翻译版本
- 使用VirtualAlloc函数在进程的地址空间中分配足以存储10个DWORD类型元素的内存区域(缓冲区)。内存分配类型(VirtualAlloc函数的第三个参数)应在MEM_COMMIT | MEM_RESERVE中设置。对内存区域的访问类型(VirtualAlloc函数的第四个参数)必须设置为PAGE_READWRITE。
- 使用VirtualQuery函数获取分配的内存区域的大小并将其显示在屏幕上。
- 按如下方式填充缓冲元素:每个第i个元素的值为4 * i * i。
- 在屏幕上显示缓冲区的内容。
- 使用VirtualFree函数释放分配的内存区域。操作类型(VirtualFree函数的第三个参数)必须设置为MEM_RELEASE。
编译器
visual studio2013 ,不同版本有细微差异,不过都是小修即可完整运行
代码
#include<iostream>
#include<windows.h>
using namespace std;
void task_one_part_three() {
DWORD *p = (DWORD *) VirtualAlloc(0, 10 * sizeof(DWORD), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
cout << VirtualQuery(p, nullptr, 0) << endl;
for (int i = 0; i < 10; ++i) {
*(p + i) = 4 * (i + 1) * (i + 1);
}
for (int i = 0; i < 10; ++i) {
cout << *(p + i);
if (i != 9)
cout << " ";
}
VirtualFree(p, 0, MEM_RELEASE);
};
int main() {
task_one_part_three();
}