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

时间:2016-02-16 20:15:01

标签: c++ c function pointers memory

我正在使用指针将对象添加到队列中并遇到一个奇怪的行为问题我无法理解。

添加到队列中的每个对象都有一个' next'将它们全部链接在一起的指针,我有一个开始'并且'结束'用于跟踪队列每端的位置的指针。

我遇到的问题是,当我传递结束指针和对象(通过其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会更改为其他对象。

1 个答案:

答案 0 :(得分:0)

如果你这样做

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

然后将endRQ传递给该函数,这与您通过RQStart时的情况相同。

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

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