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变量的地址比两者都小,我认为它必须更高,因为变量存储在堆栈中!并且堆栈比堆具有更高的地址!
最佳答案
因为所有三个变量都在函数中定义,所以它们都存在于堆栈中。堆栈通常向下增长,因此看起来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字节的填充。
关于c - 变量的地址低于指针的地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33268605/