【问题标题】:C++ Unrelated pointer changing after function call函数调用后C ++无关指针更改
【发布时间】:2016-05-28 07:08:16
【问题描述】:

我正在使用指针将对象添加到队列中,但遇到了一个我无法弄清楚的奇怪行为问题。

添加到队列中的每个对象都有一个将它们链接在一起的“下一个”指针,我有一个“开始”和“结束”指针来跟踪队列的每一端的位置。

我遇到的问题是,当我传递结束指针和对象(通过它的 processID 存储在 pArray 中)时,它也会更改开始指针——即使我没有将它传递给函数。

// snippet from my main.cpp
RQCount = 0;
if (RQCount == 0)
    {
        RQStart = &pArray[processID];
        RQStart -> next = &pArray[processID];
        endRQ = &pArray[processID];
        pArray[processID].setStatus("Ready");

        CPUHolder = RQStart;
        CPU = RQStart -> CPUBurst;

        RQStart ->pStatus = "Executing";
    }
    else
    {
        *endRQ = FCFS(endRQ, &pArray[processID]);
        pArray[processID].setStatus("Ready")
    }
RQCount++;

FCSC 方法:

PCB FCFS (PCB *endRQ, PCB *obj)
{
    endRQ -> next = obj;
    endRQ = obj;

    return *endRQ;
};

我已经把它缩小到函数,真正让我难过的是我将这两行代码移到我的主代码中,它运行和表现都很好。当我添加它没有的功能时。我认为这与我如何处理指针和取消引用有关,但我可以使用一些帮助来理解这一点。谢谢!

编辑:

要强调的是,我没有遇到变量在函数中没有变化的问题,因为有人将此标记为重复问题。问题是在调用函数后,它会更改 RQStart (未传递给函数)。

如果我不使用函数,RQStart 保持不变,当我使用函数时,RQStart 会更改为不同的对象。

【问题讨论】:

  • 我在堆栈溢出中看到了很多奇怪的行为问题。
  • return *endRQ; 返回endRQ 的副本,这可能不是您想要的。
  • 您需要发布Minimal Complete Verifiable Example。其实,在开发MCVE的过程中,希望大家自己去发现问题。
  • "如果我不使用函数,RQStart 保持不变,当我使用函数时,RQStart 会更改为不同的对象。" 嗯,这是您在代码中遇到未定义行为的强烈迹象。除非您发布 minimal reproducible example,否则我们实际上无法判断问题所在。

标签: c++ c function pointers memory


【解决方案1】:

如果你这样做了

    RQStart = &pArray[processID];
    // ...
    endRQ = &pArray[processID];

然后将endRQ 传递给函数,这与传递RQStart 相同。

因此,当您更改 endRQ->next 时,RQStart->next 也会更改。

这是标准容器将end() 指向一个过去最后一个元素,而不是最后一个元素的原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2011-01-29
    • 2014-10-29
    • 1970-01-01
    相关资源
    最近更新 更多