如果我有一个函数 foo() 并且我想使用 VirtualProtectEx() 来更改属性 函数 foo() 中的变量。
像这样 VirtualProtectEx( GetCurrentProcess(), p, sizeof(DWORD), PAGE_READONLY, &old);
当我设置“PAGE_READONLY”并编译它时,消息将显示访问冲突。
如果我设置“PAGE_READWRITE”,它将成功执行。
有什么问题吗?
最佳答案
您的代码的问题是 p
存储在堆栈中。通过调用VirtualProtectEx
,它将影响整个页面,而不仅仅是p
(每个内存页面是无法进一步分割的最小实体)。因此,如果您尝试仅更改 p
的权限,它将更改整个页面(在您的情况下为整个堆栈)的权限。如果您将堆栈设置为只读,则将无法再执行您的程序,并将导致出现内存访问冲突异常。因此,为了解决这个问题,请考虑在堆中分配 p
并在使用完毕后释放它们。
关于c - 设置 PAGE_READONLY(使用 VirtualprotectEx() )时怎么会出现访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7949584/