Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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上的程序内存布局(VS2010) 最近我读了一些关于C++内存布局的文章,简单地说,我理解有3个主要的部分: 固定内存:代码、全局和静态变量 堆栈内存:本地值和函数值 堆内存:由用户管理的内存(malloc/free new/delete)_C++_Visual Studio 2010_Memory_Layout - Fatal编程技术网

实际C++;Windows上的程序内存布局(VS2010) 最近我读了一些关于C++内存布局的文章,简单地说,我理解有3个主要的部分: 固定内存:代码、全局和静态变量 堆栈内存:本地值和函数值 堆内存:由用户管理的内存(malloc/free new/delete)

实际C++;Windows上的程序内存布局(VS2010) 最近我读了一些关于C++内存布局的文章,简单地说,我理解有3个主要的部分: 固定内存:代码、全局和静态变量 堆栈内存:本地值和函数值 堆内存:由用户管理的内存(malloc/free new/delete),c++,visual-studio-2010,memory,layout,C++,Visual Studio 2010,Memory,Layout,根据我读到的帖子,我假设上面的部分分配了一大块内存 为了检查这一点,我创建了一个简单的程序: #include <stdio.h> int g_loopCount; static int gs_one = 1; int getLifeResult(int a) { printf("&a %d\t\t%p\n", g_loopCount, &a); if(++g_loopCount < 4) { getLifeR

根据我读到的帖子,我假设上面的部分分配了一大块内存

为了检查这一点,我创建了一个简单的程序:

#include <stdio.h>

int g_loopCount;
static int gs_one = 1;

int getLifeResult(int a)
{
    printf("&a     %d\t\t%p\n", g_loopCount, &a);
    if(++g_loopCount < 4)
    {
        getLifeResult(a);
    }
    else
    {
        return g_loopCount * 10 + a;
    }
}

int main()
{
    //fixed
    printf("-fixed-\n");
    printf("&gs_one\t\t\t%p\n", &gs_one);
    g_loopCount = 0;
    printf("&g_loopCount\t\t%p\n\n", &g_loopCount);

    int* lifeResult = new int(0);
    int* lifeResultCopy = new int(0);

    //stack
    printf("-stack-\n");
    printf("&lifeResult\t\t%p\n", &lifeResult);
    printf("&lifeResultC\t\t%p\n", &lifeResultCopy);
    *lifeResult = getLifeResult(2);
    *lifeResultCopy = *lifeResult;
    printf("\n");

    //heap
    printf("-heap-\n");
    printf("lifeResult\t\t%p\n", lifeResult);
    printf("lifeResultC\t\t%p\n\n", lifeResultCopy);

    return *lifeResult;
}
这正常吗?这些块的位置取决于什么:操作系统、编译器?这会发生在每个操作系统上吗?有人能再给我解释一下这个机制吗


谢谢大家!

操作系统主宰一切

首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生

看看这个:


此外,您的程序可以使用的堆栈数量可能会发生变化

操作系统主宰一切

首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生

看看这个:


此外,您的程序可以使用的堆栈数量可能会发生变化

操作系统主宰一切

首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生

看看这个:


此外,您的程序可以使用的堆栈数量可能会发生变化

操作系统主宰一切

首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生

看看这个:


此外,您的程序可以使用的堆栈数量可能会发生变化

您可以通过转到项目设置并转到:

Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”


您还可以使用固定基址(/fixed/base)

您可以通过转到项目设置并转到:

Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”


您还可以使用固定基址(/fixed/base)

您可以通过转到项目设置并转到:

Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”


您还可以使用固定基址(/fixed/base)

您可以通过转到项目设置并转到:

Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”

您还可以使用固定基址(/fixed/base)