vs2010中的变量安排

时间:2011-12-15 05:28:53

标签: c++ c visual-studio-2010 gcc compiler-construction

代码:// 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

我的问题:

  1. Why are the global variables not stored in order?上述输出表示它们是无序的。

  2. Why are the local varialbes not stored continuously?以上输出表示VS2010每两个插入8字节空间。

  3. 有人可以帮助我吗?非常感谢!

    ---------------------------------------补充------- -----------------------------------

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

    int a;
    int b;
    int c;
    int d;
    
    void main(){
            //output the address of global variables
        printf("%p, %p, %p, %p\n", &a, &b, &c, &d);
    
        int a1, b1, c1, d1;
            //output the address of local variables
        printf("%p, %p, %p, %p\n", &a1, &b1, &c1, &d1);
    
        int a2 = 1;
        int b2 = 2; int c2; int d2 = 4;
            //output the address of local variables
        printf("%p, %p, %p, %p\n", &a2, &b2, &c2, &d2);
    }
    

    输出:

    0x60103c, 0x601034, 0x601038, 0x601030
    0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
    0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc
    

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

    所以我想知道vs2010为我们的代码做什么以及为什么这样做。

2 个答案:

答案 0 :(得分:2)

规范中没有指定它们,编译器可以做它想做的事情。

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

答案 1 :(得分:0)

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

因此,您的代码并未证明变量未连续存储。