Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows 7和Windows 8.1之间的堆栈地址差异_C++_Windows_Visual C++_Memory - Fatal编程技术网

C++ Windows 7和Windows 8.1之间的堆栈地址差异

C++ Windows 7和Windows 8.1之间的堆栈地址差异,c++,windows,visual-c++,memory,C++,Windows,Visual C++,Memory,考虑以下琐碎的代码: #include <iostream> #include <iomanip> int main(int argc, char* argv[]) { int i = -1; std::cout << std::hex << &i << std::endl; return 0; } #包括 #包括 int main(int argc,char*argv[]) { int i=-1; std::c

考虑以下琐碎的代码:

#include <iostream>
#include <iomanip>

int main(int argc, char* argv[])
{
  int i = -1;
  std::cout << std::hex << &i << std::endl;
  return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
int i=-1;

std::cout让我们看看如何创建流程(简化):

  • OS(从父进程)创建地址和进程空间
  • 调度器切换到新进程并运行存根(现在在创建的进程上下文中),进程的内核堆栈和应用程序堆栈被创建(假设每个线程有一个内核和应用程序堆栈)
  • 进入用户模式
  • 存根拉入可执行文件、库和资源。设置额外的东西,如安全性和初始化句柄。所有东西都使用应用程序的堆栈
  • 跳转到程序入口,即示例中的C运行时
  • crt调用ctor并完成最后的工作
  • main()
  • 由于C运行时是静态链接的,并且在两个测试中没有更改,所以它也非常简单,我怀疑进程存根是变量,它还有很多工作要做

    顺便说一句,C(和C++)有很好的启动条件,但是堆栈地址不在要求的条件内


    注:因为我们都没有windows的代码。我们所能做的只是有根据的猜测。

    一些同事让我讨论WriteProcessMemory函数。我写了一些简单的代码,然后读/写结果进程。然而,问题是,我的示例代码只在windows 7上工作,因为堆栈地址在Win中会发生变化dows 8.1.为什么需要如此严格的堆栈地址位置规则?它们是不同的操作系统,为什么希望进程内存布局相同?很可能只是运行库中的差异。调用
    main()的堆栈框架
    有一些额外的变量。或者堆栈的起始位置不同。Windows进程是由运行在进程中的操作系统代码在应用程序堆栈上初始化的。加载程序每次使用的堆栈空间不会完全相同。OP没有指定他使用的是静态链接的运行时-@a维吉达,你能澄清一下吗?@davidbak我尝试过使用/MT开关进行静态链接。虽然它确实会影响堆栈地址,但在Windows 7和8.1计算机上,I的地址仍然相差8字节。即使你使用msvcrt.dll,但它们在两个测试中有所不同,启动代码(程序入口)如果仍然是静态链接的,则启动代码可能会从dll调用init函数,但是由于该函数应与C兼容abi,因此堆栈不应更改。是的,没有理由期望加载程序每次使用相同数量的堆栈。如果希望变量始终位于同一位置,则必须将其设置为静态变量(并禁止重新安置)。谢谢@Harry Johnston,关于使变量为静态的评论实际上非常有用,解决了我的问题。我可以在WriteProcessMemory示例中使用静态变量,并且静态变量在两种环境中都有相同的地址。但是,我将Calvin的答案标记为已接受的答案,因为他确实回答了我关于w的问题为什么堆栈上的地址不同。