c - 设置 PAGE_READONLY(使用 VirtualprotectEx() )时怎么会出现访问冲突?

标签 c

如果我有一个函数 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/

相关文章:

c++ - QImage数组的动态分配

c - 在英特尔 64 位机器上启用/禁用缓存 : CD bit always set?

c - 我如何使用c将数据保存在二进制文件中

c - 将 32 位值快速散列到 0 到 254(含)之间

c - ACS_BLOCK 和 ACS_CKBOARD 在 nCurses 中不工作,而其余的 ACS 字符在工作

c - 如何有效地将大数组加载到GPU共享内存?

c - 关于初始化指针变量

c - printf ("%c",*(*(ptr+i)+x)) 和 printf ("%s",*(*(ptr+i)+x)) 的区别

c - 使用 Autotools 将外部库纳入源代码树

c - Doxygen 与\file 命令中的路径相关的问题