指向地址和内存堆栈的指针

时间:2013-02-05 18:18:50

标签: c++ memory-management

void EventsStack::push(Event *e){
    EventNode *q = new EventNode();
    q->data = e;
    q->next = _top;
    _top = q;
}

void main() {
    EventsStack eventStack;
    Event e1(1);
    eventStack.push(&e1);
    Event e2(2);
    eventStack.push(&e2);
}

第一个问题:当我做的时候

eventStack.push(&e1);

我是否将e1的地址发送到推送功能,而推送功能将其作为指针接收?好像我在做:

Event *e = 1000 (1000 is the offset (address) of e1 for example on the stack)

第二个问题:我被要求在运行main函数时说明堆栈。当我到达行

eventStack.push(&e1);

将一个4字节的返回地址和一个指向e1的4byte指针作为函数的激活帧分配,或者在这种情况下没有激活帧,因为eventStack是EventStack类的一个对象,push是其成员函数之一?

2 个答案:

答案 0 :(得分:1)

关于你的第一个问题:表达式&e1需要 e1的地址,这是一个指针。换句话说,e1 类型为Event&e1类型为Event*,值为{。}} 取消引用它(一元*运算符)将具有 与使用e1相同的效果。这就是你传递给推动者的东西 功能。

指针不能只是堆栈上的偏移量,因为它 必须可以从其他地方用它访问对象, 堆栈不一定可用的地方。最现代的 桌面机器使用线性寻址,这意味着 指针只是一个整数,但并不总是如此 在某些嵌入式处理器上可能并非如此 (以及某些大型机的历史原因)。

关于第二个问题:正式地说,它完全是 未指定的如何调用函数。有必要的是 编译器放置返回地址和参数 被调用函数可以找到它们的地方。在里面 表达式eventStack.push( &e1 ),函数有两个 参数,eventStack的地址(将成为。{ 函数中的this指针)和表达式&e1。怎么样 编译器通过这些变化很大,差不多 总是取决于他们的类型,但通常,在大多数现代 机器,前3到5个参数将进入机器 注册它们是否合适(并且您传递的两个地址都将适用) 因此,所有被推到机器堆栈上的都是返回 地址。而参数通常不被认为是其中的一部分 当前帧,虽然在一些较旧的处理器上,编译器 确实如此对待他们。 (你说你是“被要求说明的 堆栈“。问题是指特定的机器 建筑,还是什么?堆栈上实际发生的事情会 编译器之间差异很大,Linux下的g ++会有所不同 经常做一些与Visual Studios完全不同的事情, 即使在同一处理器上运行。)

答案 1 :(得分:0)

关于第一个问题,是:&运算符会产生事件的内存地址。

至于你的第二个问题,那很复杂。您所做的描述似乎表明了堆栈如何工作的潜在混淆。我强烈建议您阅读有关该主题的一些介绍性材料,这将使您更加了解。

如果你稍微去谷歌,几个小时后你就可以回答你自己的问题:)。