我有一个名为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>;
不能保证
begin
和end
彼此相邻。您只能对指向同一内存区域(如数组)的指针使用指针算术,否则您将具有未定义的行为。
关于c++ - 在用户定义的类型上使用std::ptrdiff_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27758511/