C++ 函数调用后无关指针发生变化

标签 c++ c function pointers memory

我正在研究使用指针将对象添加到队列中,但遇到了一个我不太明白的奇怪行为问题。

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

我遇到的问题是,当我传递结束指针和对象(通过其 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;
};

我已经将其范围缩小到了函数,真正让我困惑的是我将这两行代码移到了我的 main 中,它运行并表现得很好。当我添加它没有添加的功能时。我认为这与我处理指针和取消引用的方式有关,但我可以使用一些帮助来理解这一点。谢谢!

编辑:

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

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

最佳答案

如果你这样做

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

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

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

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

关于C++ 函数调用后无关指针发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442135/

相关文章:

c++ - 想要更新结果

c++ - 为什么 lower_bound 和 upper_bound 的谓词版本不一致地传递迭代器值?

c++ - Matlab Coder 与手动编码?

scala - 为什么用作默认参数的函数文字需要参数类型?

sql - 在 PL/PGSQL 动态 SQL 内部函数中引用局部变量

android - 适用于 Android NDK 的 Googletest

c - 如何使用 -lusb 进行编译

带管道的 c 程序执行 "ps aux | grep firefox | tee processes.txt"

Javascript:使用对象作为函数?

c++ - C++ std::set 的排序输出