我读过很多次,堆栈从最高地址到最低地址向下增长。我找不到任何显示此内容的示例。到目前为止,我觉得我找不到一种方法来复制它,尽管这可能只是我自己的错。
我试图编写一个应用程序以可视化方式向自己说明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减小,因为我对堆栈的了解是,这些值应该从最高地址开始,然后降到最低。价值似乎总是在增加。
我可能做错了什么,但是我不知道那会是什么,也不知道如何说明堆栈中的新值会为每个新值赋予较低的地址。谁能帮忙直观地显示出来吗?我看过很多图片,但是我从未看过一个衍生自代码的示例可以证明这一点。
答案 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