在两个VPS上运行的同一程序的两个局部变量具有不同的地址顺序?

时间:2018-10-22 05:32:14

标签: c memory-address

我有两个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却反过来...?

2 个答案:

答案 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)

差异很小。但这可能是原因