我如何通过示例查看堆栈的内存寻址?

时间:2019-08-04 00:52:55

标签: c stack

我读过很多次,堆栈从最高地址到最低地址向下增长。我找不到任何显示此内容的示例。到目前为止,我觉得我找不到一种方法来复制它,尽管这可能只是我自己的错。

我试图编写一个应用程序以可视化方式向自己说明C中堆栈的内存寻址,并将其与堆进行比较。

#include <stdio.h>
#include <stdlib.h>

int main() {
    const int _a = 0;
    const int _b = 0;
    const int _c = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    int * pa = (int*)malloc(sizeof(int));
    int * pb = (int*)malloc(sizeof(int));
    int * pc = (int*)malloc(sizeof(int));

    int i = 0;
    i++; printf("%i -- %li\n", i, &_a);     
    i++; printf("%i -- %li\n", i, &_b);     
    i++; printf("%i -- %li\n", i, &_c);     
    i++; printf("%i -- %li\n", i, &a);  
    i++; printf("%i -- %li\n", i, &b);  
    i++; printf("%i -- %li\n", i, &c);  
    i++; printf("%i -- %li\n", i, pa);  
    i++; printf("%i -- %li\n", i, pb);  
    i++; printf("%i -- %li\n", i, pc);  
}


运行此命令时,我得到以下信息:

❯ ./main
1 -- 140730484837108
2 -- 140730484837112
3 -- 140730484837116
4 -- 140730484837120
5 -- 140730484837124
6 -- 140730484837128
7 -- 94440756302432
8 -- 94440756302464
9 -- 94440756302496

我的期望是看到值1-6减小,因为我对堆栈的了解是,这些值应该从最高地址开始,然后降到最低。价值似乎总是在增加。

我可能做错了什么,但是我不知道那会是什么,也不知道如何说明堆栈中的新值会为每个新值赋予较低的地址。谁能帮忙直观地显示出来吗?我看过很多图片,但是我从未看过一个衍生自代码的示例可以证明这一点。

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

void stack(int count)
{
    int j;
    j = count;
    printf ("depth = %d, address = %p\n", j, &j);
    if (j < 9)
        stack (j + 1);
}

int main()
{
    stack(0);
}

对我来说,结果:

  

深度= 0,地址= 0x7ffc85c84114
  深度= 1,地址= 0x7ffc85c840e4
  深度= 2,地址= 0x7ffc85c840b4
  深度= 3,地址= 0x7ffc85c84084
  深度= 4,地址= 0x7ffc85c84054
  深度= 5,地址= 0x7ffc85c84024
  深度= 6,地址= 0x7ffc85c83ff4
  深度= 7,地址= 0x7ffc85c83fc4
  深度= 8,地址= 0x7ffc85c83f94
  深度= 9,地址= 0x7ffc85c83f64

答案 1 :(得分:0)

它与变量的声明顺序无关。编译器在编译时就知道堆栈要求,并可以在堆栈空间内以任意顺序分配变量。而且,它甚至可能不在堆栈上分配它们。

我认为证明它的最好方法是要求系统动态分配堆栈。做到这一点的方法是使用@Injectable({ providedIn: 'root' }) export class GamestateService { public socket: any; public userID: number; constructor(private firebaseMessaging: FirebaseMessaging, public navCtrl:NavController) { this.socket = io('http://192.168.1.3:3001'); this.socket.on('push-client-id', (data) => { this.userID = data.id; console.log("My ID is:", this.userID); }) this.getServerNotificationToken(); } getID():number { return this.userID; } getServerNotificationToken() { console.log("In firebase messaging..."); this.firebaseMessaging.getToken().then((token) => { console.log("Token received: ", token); let tokenResponseObj = { token, userId: this.userID } console.log("My user id:", this.userID); console.log("tokenResponseObj.userId:", tokenResponseObj.userId); console.log("tokenResponseObj.token:", tokenResponseObj.token); this.socket.emit('token-received', tokenResponseObj); }); } } 调用。因此,这是一个示例:

alloca