我在模板类(一个简单的 FIFO 队列)中有以下方法,在 GDB 调试时,我发现将指针“前一个”重新分配给“当前”的语句似乎什么也没做。
执行此语句时,previous 开始为 NULL,current 不是 NULL,而 previous 仍为 NULL。
有没有人见过这样的事情?

inline int search(QueueEntry<T> *current,QueueEntry<T> *previous, unsigned long long t)
{
  while(current && !(current->getItem()->equals(t)))
  {
    previous = current; //**this line doesn't seem to work**
    current = current->getNext();
  }
  if(current)
    return 1;
  return 0;
}

最佳答案

你在哪里检查 previous 的值?如果您在此函数中执行此操作,则在分配之后,请确保构建已关闭优化,然后再试一次。

另一方面,如果您在此函数的范围之外查看 previous,则它永远不会被修改。当您调用 search() 时,指针 previous 的拷贝被加载到堆栈中,并且您正在修改此拷贝。函数退出后修改消失。要保持修改,请执行以下操作:

inline int search(QueueEntry<T> *current,QueueEntry<T> **previous, unsigned long long t)
{
    ...
    *previous = current;
    ...
}

search() 的调用现在必须将地址而不是值传递给指针。

或者,您可以传递一个引用,而您的其余代码保持不变。
inline int search(QueueEntry<T> *current,QueueEntry<T> *&previous, unsigned long long t)

关于C++ 指针赋值语句似乎不起作用/做任何事情,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6751779/

10-13 08:30