繁体   English   中英

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

[英]What's the difference between ways in assigning a pointer?

感谢您查看我的问题。 我刚刚在实现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;
}

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

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

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

  • 第一个赋值p = &q是完全有效的,因为q是内存中的实际对象, p是指向它的指针
  • 第二分配p = q分配一个未初始化指针qp ,这是未定义的行为。

这就是为什么这两种实现方式不同。

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

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

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

请注意第一种情况:

//  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函数返回,其堆栈帧就会被激活,并且所有局部变量/对象都将变为无效,因此,您将遇到内存错误。

int *p, q;
p = &q;

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

int *p, *q;
p = q;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM