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

最佳答案

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

这意味着如果您有

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

不能保证beginend彼此相邻。

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

关于c++ - 在用户定义的类型上使用std::ptrdiff_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27758511/

10-11 16:09