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/

10-11 19:34