我正在做家庭作業,我有一個奇怪的問題,我希望有人可以幫助我。我在我的代碼中間有一個函數:爲什麼指針地址在返回時改變?
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);
}
這段代碼做了我需要它做的一切,除了最後。它正確地將所有變量設置爲我所需要的。這是它不起作用的地方:我一步一步地運行它,然後在運行最後一行 return token(「ok」,「ok」,0)後看到它。 idList的值從合法值更改爲瘋狂值(例如,idList的行號中的第一個id從2更改爲-17891602。
如果我爲標識列表和使用命名空間std #PRAGMA一次 ; 的#include 的#include 的#include 的#include 的#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.
};
而一個已識別:令牌包括: 令牌RLIST:
class identifierList
{
friend class scheme;
public:
Token * id;
identifierList * next;
identifierList(Token * inId, identifierList * inNext);
};
我沒有得到它 - 爲什麼任何時候我做的是從函數返回變化的變量?
爲了便於閱讀,在'(* arrow).id'之上選擇'arrow-> id'。 – 2013-02-28 21:11:58
您正在按值向量傳遞'toAdd',因此您正在接收向量及其內容的副本。然後你正在使用向量元素的地址:'&(toAdd.at(i))'。當你離開函數時,vector的拷貝被破壞,指針不再有效。改變'addScheme'的簽名來接受引用 – 2013-02-28 21:20:57