我有两个AWS lightail vps框,并且正在两个vps上尝试以下简单的C程序来测试局部变量的地址。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("buffer_one is at %p\n", buffer_one);
printf("buffer_two is at %p\n", buffer_two);
return 0;
}
在方框A(正在运行ubuntu 14.04)上,它会产生类似以下内容:
buffer_one is at 0x7ffd1fe3d5a0
buffer_two is at 0x7ffd1fe3d5b0
在B框上(运行Centos 7.5,如下所示:
buffer_one is at 0x7fffa53678a0
buffer_two is at 0x7fffa5367890
我很惊讶,因为两个变量都在main函数中,这使它们成为局部变量,因此在运行时应将它们存储在程序地址空间的“堆栈”中。如果是这样,第一个变量( buffer_one )的地址应比第二个变量( buffer_two )高。确实,在B中就是这种情况,但是为什么A却反过来...?
答案 0 :(得分:1)
除了易北河的答案,我想补充一下原因。
编译器仅确保局部变量在堆栈上。 要做的只是确保最终程序按照源代码的期望执行。
因此,不能保证实际的布局和顺序,因为它们不会影响正常程序的行为。 它们取决于编译器的实现。
编译器可能正在做一些优化,或者可能正在使用不同的指令生成技术。所有这些都可能影响局部变量的布局(即实际位置)。
这就是为什么不同的编译器,甚至同一编译器的不同版本,都有不同的结果的原因。
答案 1 :(得分:0)
在两台计算机上检查您的gcc版本。可能是因为版本不同。
ubuntu 14.04可能具有gcc-4.8(> = 4.8.2-5〜)
centos 7.5可能具有gcc(GCC)4.8.2 20140120(Red Hat 4.8.2-16)
差异很小。但这可能是原因