代码:// 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
我的问题:
Why are the global variables not stored in order
?上述输出表示它们是无序的。
Why are the local varialbes not stored continuously
?以上输出表示VS2010每两个插入8字节空间。
有人可以帮助我吗?非常感谢!
---------------------------------------补充------- -----------------------------------
代码:\ 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为我们的代码做什么以及为什么这样做。
答案 0 :(得分:2)
规范中没有指定它们,编译器可以做它想做的事情。
对于局部变量,您可能正在使用DEBUG
构建,并且插入填充以检查堆栈完整性。如果发生任何内存溢出,填充将被覆盖并且会发现溢出。
答案 1 :(得分:0)
您的程序具有未定义的行为,因为格式字符串中指定的类型与传递给printf
的其他参数的类型不匹配。
因此,您的代码并未证明变量未连续存储。