1

我有一个名为 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
}                                       

我们主要创建 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 ?

4

2 回答 2

4

您的节点不是数组的一部分。它们分别被分配在内存分配器可以为它们找到的任何位置。您不能减去它们并期望任何特定值。事实上,这样做是未定义的行为。为了计算链表中节点之间的距离,您需要按照 next 或 prev 指针对其进行迭代。

于 2015-01-03T19:13:31.257 回答
3

请记住,分配不必是连续的,即使您在彼此相邻的地方进行分配。

这意味着如果你有例如

begin = new node<T>;
end = new node<T>;

不能保证,begin并且end将彼此相邻。

您只能对指向同一内存区域的指针(如数组)使用指针算术,否则您将有未定义的行为。

于 2015-01-03T19:13:39.520 回答