我试图理解一些看起来像这样的代码:
node* temp = (marker*)(ptr);
node* holder = *((&(temp)) + (-1));
这似乎是从内存地址中减去。
它是否等同于:node* holder = temp->prev;
?
答案 0 :(得分:4)
&(temp)是存储temp的内存地址。这是当前函数中的局部变量,因此它位于堆栈中。
添加(-1)与减去1.相同的行为是implementation-dependent。也就是说,它要么返回堆栈上的下一个地址 - 在这种情况下是持有者的地址 - 或堆栈中的先前地址 - 我们无法从其余代码中看到它是什么;根据情况,它甚至可能是传递给函数的参数之一。
无论哪种方式,评论者都表示这个代码完全有效,这似乎是一个意外。
答案 1 :(得分:0)
它不等于temp-> prev;
如果每个节点是独立分配的(即不在阵列中),则存储器地址可以间隔很远。因此,从内存地址中减去一个是永远不会在一百万年内获得列表中的前一项的好方法。
这个代码是像你自己这样的新程序员不应该处理的,也不应该写。 Sheesh,我已经有15年的C ++了,我看着那个叹息......