为什么指针地址在返回时会改变?

时间:2013-02-28 21:10:08

标签: c++ pointers

我正在做家庭作业,我有一个奇怪的问题,我希望有人可以帮助我。我的代码中间有一个函数:

Token scheme::addScheme(vector <Token> toAdd)
{

//Check if scheme is valid
Token answer = isSchemeValid(toAdd);
if (answer.retType() != "ok")
{
    return answer;
}

identifierList * arrow = new identifierList(&(toAdd.at(0)), NULL);
idList = arrow;

for (int i = 2; i < toAdd.size()-1; i++)
{
    (*arrow).id = &(toAdd.at(i));
    (*arrow).next= new identifierList(&(toAdd.at(0)), NULL);
    arrow = (*arrow).next;
}


*id = toAdd.at(0);
openParen = '(';
closeParen = ')';

return Token("ok", "ok", 0);
}

这段代码完成了我需要做的所有事情,除了最后。它正确地将所有变量设置为我需要的变量。这里它不起作用:我一步一步地运行它,我在运行最后一行后立即看到它     返回令牌(“ok”,“ok”,0); idList的值从合法值变为疯狂值(例如,idList的行号中的第一个id从2变为-17891602。

如果我发布标识符列表和标记包含的标题,这可能会更有意义: 令牌:     #pragma一次     using namespace std;     #包括     #包括     #包括     #包括     #include“datalogProgram.h”

enum state {COMMA, PERIOD, Q_MARK, LEFT_PAREN, RIGHT_PAREN, COLON, COLON_DASH, MULTIPLY, ADD, SCHEMES, FACTS, RULES, QUERIES, ID, STRING, COMMENT, WHITESPACE, UNDEFINED, ENDOFFILE, START};

class Token
{
friend class datalogProgram;

public:
int lineNumber;
string type;
string value;

Token(string inType, string inValue, int inLineNum);
void route(state inState, string inValue, int inLineNum);
string retType();
string retValue();

//A list of a bunch of functions that don't matter here.
};

还有一个identifierList:

class identifierList
{
friend class scheme;
public:
Token * id;
identifierList * next;

identifierList(Token * inId, identifierList * inNext);
};

我不明白 - 为什么我所做的所有变量都会从函数返回时发生变化?

1 个答案:

答案 0 :(得分:0)

这是因为矢量toAdd是按值传递的,而不是通过引用传递的。发生的事情是传递给addScheme函数的向量被复制到堆栈。

现在,语句(&(toAdd.at(0))和类似语句引用了向量中位置0处的任何内容。这意味着它返回指向堆栈上某个位置的指针。

一旦你的函数返回,堆栈就被清除,指向堆栈上位置的指针包含垃圾。

要解决这个问题,要么通过引用传递矢量,要么更好地避免(&(toAdd.at(0)),因为这是一个非常奇怪的合同,可能永远不会像你期望的那样工作。