Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ vs2010中的可变安排_C++_C_Visual Studio 2010_Gcc_Compiler Construction - Fatal编程技术网

C++ vs2010中的可变安排

C++ vs2010中的可变安排,c++,c,visual-studio-2010,gcc,compiler-construction,C++,C,Visual Studio 2010,Gcc,Compiler Construction,Code://VS2010 int a; int b; int c; int d; int main(){ //output the address of global variables printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d); int a1, b1, c1, d1; //output the address of local variables print

Code://VS2010

int a;
int b;
int c;
int d;

int main(){
    //output the address of global variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a2, &b2, &c2, &d2);
}
输出:

0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
0x15fad0, 0x15fac4, 0x15fab8, 0x15faac
0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc
我的问题:

  • 为什么全局变量没有按顺序存储
    ?上面的输出表示它们出现故障

  • 为什么本地变量没有连续存储
    ?上面的输出表示VS2010在每两个输出之间插入8字节的空间

  • 有人能帮我吗?非常感谢

    ---------------------------------------补足------------------------------------------

    代码:\gcc版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3)

    输出:

    0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
    0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
    0x15fad0, 0x15fac4, 0x15fab8, 0x15faac
    
    0x60103c, 0x601034, 0x601038, 0x601030
    0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
    0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc
    

    在gcc中,全局变量和局部变量的地址是连续的、有序的


    因此,我想知道vs2010为我们的代码做了什么以及为什么这样做。

    它们都不是由规范指定的,编译器可以做它想做的事情


    至于局部变量,您可能正在使用
    DEBUG
    build,并插入填充以检查堆栈完整性。如果发生任何内存溢出,填充将被覆盖,溢出将被发现。

    您的程序具有未定义的行为,因为格式字符串中指定的类型与传递给
    printf
    的其他参数的类型不匹配


    因此,您的代码不能证明变量不是连续存储的。

    Yeah-请尝试printf(“%p”和&a);虽然他确实应该使用%p,但这不是变量不连续的原因@亚历克西斯·威尔克:你为什么说变量不是连续的?Daneill的代码根本没有证明这一点。它所显示的是,具有未定义行为的程序有时会产生意外的结果。我使用printf(“%p”、&a)进行了尝试。输出是一样的。我想我应该写下变量不需要以连续的方式(一个接一个)分配。尽管变量的大小可能会因为填充而使它看起来不是连续的。对于局部变量,它也可能多次重用同一位置(一旦一个变量的生存期结束,另一个变量可以安全地重用其位置),并且局部变量通常分配在寄存器中(除非像示例中那样取消引用)。我最大胆的猜测是编译器使用了类似于变量名哈希的东西。该散列已排序,但与定义变量的顺序不对应。另外,无论如何,你不应该依赖于这个顺序(除非你写汇编代码…),如果你需要有序的东西,创建一个结构或数组。谢谢Alexis!我知道你的意思,但我想知道VS2010为我们的代码做了什么以及为什么要做这些。哈希可以用来提高速度,而不是从上到下搜索数组。这就是说,他们可以利用一个额外的索引表。。。现在如果不查看代码内部,就很难说出确切的原因。