为什么变量的地址变小?

时间:2013-08-31 13:44:44

标签: c memory memory-address

我认为变量的内存地址变得越来越大,直到我尝试了这段代码:

#include <stdio.h>  

int main()
{
    int IamfirstVariable = 9;
    char array1[10] = {'0','1','2','3','4','5','6','7','8','9'};
    char array2[10] = {'0','1','2','3','4','5','6','7','8','9'};
    char IamLastVariable = '0';
    printf("variable start :%p\n",&IamfirstVariable);
    printf("array1 address start :%p    end :   %p \n",&array1[0],&array1[9]);
    printf("array2 address start :%p    end :   %p \n",&array2[0],&array2[9]);
    printf("variable end :%p\n",&IamLastVariable);
    return 0;
}

输出:

variable start :0xbfb02c3c
array1 address start :0xbfb02c32    end :   0xbfb02c3b 
array2 address start :0xbfb02c28    end :   0xbfb02c31 
variable end :0xbfb02c27

我被这个困扰了。似乎最后声明的变量获得最小的地址!

有人可以帮我解释一下吗?

---------------------- EDIT ------------------------ ----------------

我在回答中阅读了链接并得到了一个问题:

  

由于堆栈向下发光,为什么数组的地址仍然向上发光?

3 个答案:

答案 0 :(得分:3)

因为在Intel上堆栈向下增长(参见例如https://stackoverflow.com/a/1691818/613130)。您的array1array2局部变量在堆栈上分配。请注意,这是特定于平台的,而不是特定于C的。在不同的平台上,它可以成长

如果您对哪些体系结构的堆栈向上或向下增长感兴趣,则会提出类似的问题:https://stackoverflow.com/a/664779/613130

答案 1 :(得分:2)

因为变量存储在堆栈中。

堆栈内存分配使用一种非常简单的算法:堆栈指针指向第一个空白空间,并在每次添加变量时向下移动。

另请参阅:Understanding the Stack

答案 2 :(得分:1)

让我们看看空堆栈

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |
    :        |       |
0xFFFFFFFF   |       | ==>position of stack pointer
            -----------    

当变量1声明时,对var1的内存将在堆栈中分配,然后堆栈指针位置出现。

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |
    :        |       |==>position of stack pointer
0xFFFFFFFF   | var1  |
            -----------

当变量二声明时,内存到var2将在堆栈中分配,然后堆栈指针位置出现。

0x00000000   |       |
    :        |       |
    :        |       |
    :        |       |==>position of stack pointer
    :        | var2  |
0xFFFFFFFF   | var1  |
            -----------

所以最后声明的变量得到最少的地址,第一个声明的变量得到最大地址。