变量的地址低于指针的地址?

时间:2015-10-21 20:27:26

标签: c pointers stack heap

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("[BEFORE] buffer_two is at %p and containt \'%s\' \n ",buffer_two,buffer_two);

    printf("[BEFORE] buffer_one is at %p and containt \'%s\' \n ",buffer_one,buffer_one);
    printf("[BEFORE] value is at %p and is %d (0x%08x)\n",&value,value,value);
}

我得到了这个结果:

[BEFORE] buffer_two is at 0x7ffd75d46720 and containt 'two' 
 [BEFORE] buffer_one is at 0x7ffd75d46710 and containt 'one' 
 [BEFORE] value is at 0x7ffd75d4670c and is 5 (0x00000005)

正如你所看到的,buffer_two的地址高于buffer_one(因为它被推到堆上并且堆上升到更高的地址),这里的一切都很好。

我不明白为什么Value变量的地址小于两者,我认为它必须更高,因为变量存储在堆栈中!并且堆栈的地址高于堆!

2 个答案:

答案 0 :(得分:0)

因为所有三个变量都是在一个函数中定义的,所以它们都存在于堆栈中。堆栈通常向下增长,因此看起来buffer_two的空间首先被推入堆栈,然后是8个填充字节,然后是buffer_one,然后是value

话虽如此,变量放置在堆栈上的方式是实现定义的,并且在看似无关的代码更改时可能会在同一实现中发生变化。

例如,在我的系统上,此代码输出以下内容:

[BEFORE] buffer_two is at 0xbfb16110 and containt 'two' 
 [BEFORE] buffer_one is at 0xbfb16118 and containt 'one' 
 [BEFORE] value is at 0xbfb16120 and is 5 (0x00000005)

在这种情况下,变量以相反的顺序放在堆栈上,没有8字节填充。

答案 1 :(得分:0)

编译器不需要以任何特定顺序存储单独的对象(无论该存储来自堆栈,堆还是其他一些内存部分)。它不必按照您声明它们的顺序排列它们,也不必在内存中相邻。

struct成员必须按照声明的顺序排列,但它们可能相邻也可能不相邻;可能有"填充"成员之间的字节数,同样是由于对齐要求。