2013-08-31 74 views
1

我以为变量的内存地址变得越来越大,直到我试图验证码:为什么变量的地址变小?

#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 

我为此stucked。看来最后声明的变量得到最小的地址!

任何人都可以解释这对我吗?

----------------------编辑----------------------- -----------------

我读答案的联系,并得到了anohter问题:

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

+0

如果您有兴趣,请尝试使用堆而不是堆栈,然后查看结果。 –

+0

@YuHao我试过了,它给了我不连续但是增长的内存地址。我可以理解这一点,但我仍然无法理解堆栈向下发展的原因!它只是有一个堆栈限制? –

+0

因为在很多平台上,堆栈向下增长,而堆栈向上增长。尝试在内存中搜索堆栈和堆的图像。一张照片比任何单词都多。 –

回答

3

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

如果你有兴趣在其架构有一个成长向上或向下堆栈,类似的问题已经被问:https://stackoverflow.com/a/664779/613130

+0

我在这种情况下使用了由AMD –

+0

@LidongGuo Intel == AMD制造的CPU,因为它们都使用x86/x64 ABI。 – xanatos

+0

为什么数组地址仍然向上增长? –

2

因为变量存储在堆栈中。

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

参见:Understanding the Stack

+0

“向下移动”意味着移动到较小的地址? –

+0

为什么数组地址仍然向上增长? –

1

让我们看看空栈

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

时可变一个声明,内存到var1将被分配在堆栈中,然后堆栈指针位置出现。

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

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

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

所以最后声明的变量获取最小地址并首先声明变量获得最大地址。