我认为变量的内存地址变得越来越大,直到我尝试了这段代码:
#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 ------------------------ ----------------
我在回答中阅读了链接并得到了一个问题:
由于堆栈向下发光,为什么数组的地址仍然向上发光?
答案 0 :(得分:3)
因为在Intel上堆栈向下增长(参见例如https://stackoverflow.com/a/1691818/613130)。您的array1
和array2
局部变量在堆栈上分配。请注意,这是特定于平台的,而不是特定于C的。在不同的平台上,它可以成长。
如果您对哪些体系结构的堆栈向上或向下增长感兴趣,则会提出类似的问题:https://stackoverflow.com/a/664779/613130
答案 1 :(得分:2)
答案 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 |
-----------
所以最后声明的变量得到最少的地址,第一个声明的变量得到最大地址。