【发布时间】: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