分配指针的方法有什么区别?

时间:2016-06-17 02:30:33

标签: c++

感谢您查看我的问题。我刚刚在实现BST时遇到了一个非常根本的问题,那就是“分配指针的不同方法有什么区别?”我们都知道指定一个点可以使用:

int *p, q;
p = &q;

或者:

int *p, *q;
p = q;

他们应该是一样的。但在我的情况下,他们的工作完全不同:

template <typename T>
void Tree<T>::_insert(TreeNode<T>*& tree, const T& value, const unsigned& key)
{
//  TreeNode<T> node(value, key);
//  if(tree == nullptr) tree = &node;
    TreeNode<T> *node = new TreeNode<T>(value, key);
    if(tree == nullptr) tree = node;

    else if(key < tree->index) _insert(tree->left, value, key);
    else if(key > tree->index) _insert(tree->right, value, key);
    else if(key == tree->index) std::cerr << "_insert: repeating key" << std::endl;
}

使用第一种方式(注明一项),该函数不会指定等于节点的树,而第二种方式可以正常工作。

那么,这是我的错写,还是他们自然不同?

3 个答案:

答案 0 :(得分:3)

不,这两种方式不应该相同:

  • 第一个作业p = &q完全有效,因为q是内存中的实际对象,而p是指向它的指针
  • 第二个作业p = q将一个单一化指针q分配给p,这是未定义的行为。

这就是两种实现不同的原因。

如果您想将q分配给p,则需要首先分配q本身。例如,您可以为其指定new int

int *p, *q = new int;
p = q;

但是,在这种情况下,您也可以直接将new int分配给p

答案 1 :(得分:3)

请注意第一种情况:

//  TreeNode<T> node(value, key);
//  if(tree == nullptr) tree = &node;

node是在堆栈上分配的对象。

在第二种情况下

TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;

node分配在

不同之处在于,一旦_insert函数返回,其堆栈帧就会被激活,并且所有局部变量/对象都将变为无效,因此,您将遇到内存错误。

答案 2 :(得分:0)

replaceState()

这意味着p现在具有整数q存储在存储器中的地址。

int *p, q;
p = &q;

在此,您将指针q中存储的地址复制到p。