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

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

谁能为我解释一下?

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

我阅读了答案中的链接并得到了另一个问题:

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

4

3 回答 3

3

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

如果您对哪些架构具有向上或向下增长的堆栈感兴趣,已经提出了类似的问题:https ://stackoverflow.com/a/664779/613130

于 2013-08-31T13:48:09.120 回答
2

因为变量存储在堆栈中。

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

另请参阅:了解堆栈

于 2013-08-31T13:47:34.333 回答
1

让我们看看空堆栈

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

当变量 1 声明时,var1 的内存将被分配到堆栈中,然后堆栈指针位置上升。

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

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

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

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

于 2013-08-31T14:09:54.050 回答