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变量的地址小于两者,我认为它必须更高,因为变量存储在堆栈中!并且堆栈的地址高于堆!
答案 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
成员必须按照声明的顺序排列,但它们可能相邻也可能不相邻;可能有"填充"成员之间的字节数,同样是由于对齐要求。