【发布时间】:2015-03-01 18:00:14
【问题描述】:
我有一个名为 node 的简单结构,它包含一个值 + 2 个指向下一个/上一个节点的指针。
template <class T>
struct node {
node<T> *prev = NULL;
node<T> *next = NULL;
T data;
};
这里我们有在末尾添加一个新节点的函数。
void push_back( T val ) {
node<T> *n = new node<T>; // create node to hold val
n->data = val; // set node data with val
if ( node_count == 0 ) {
begins = n; // begins points to first node
}
else{
ends->next = n; // set next in ends
n->prev = ends; // set previous
}
ends = n; // update ends
node_count++; // update list size
}
在 main 中,我们创建了 100 个链接节点,每个节点都有一个唯一的 int 值。
for (int i = 0; i != 100; i++){ push_back(i); }
这里是指向第一个/最后一个节点的指针:
node<T> *begins;
node<T> *ends;
当尝试应用指针算法时,麻烦就开始了:
std::ptrdiff_t node_sum = ends - begins;
不知何故 node_sum == 528,如果我进行 x32 编译,则 node_sum == 781。
为什么 node_sum 不是 100 ?
【问题讨论】:
-
这段代码能编译吗?在
push_back函数中没有begin和end,除非你将它们设为全局。 -
不保证单独的节点在列表中的位置;第一个节点可能位于第二个之前和第三个之后。
ptrdiff_t类型用于将两个指针之间的差异放入有保证的连续内存中,这意味着两个指针指向单个数组中的位置(或数组末尾之外的一个元素)。其他任何事情都会导致未定义的行为;任何结果都是可能的,而且都是正确的。 -
@Shan:发布的代码无法编译,但源代码可以编译,我删除了相关部分以使其更容易阅读。