我正在研究使用指针将对象添加到队列中,但遇到了一个我不太明白的奇怪行为问题。
添加到队列中的每个对象都有一个“下一个”指针将它们链接在一起,并且我有一个“开始”和“结束”指针来跟踪队列每个末端的位置。
我遇到的问题是,当我传递结束指针和对象(通过其 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/