2013-02-28 118 views
0

我正在做家庭作业,我有一个奇怪的问题,我希望有人可以帮助我。我在我的代码中间有一个函数:为什么指针地址在返回时改变?

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); 
}; 

我没有得到它 - 为什么任何时候我做的是从函数返回变化的变量?

+3

为了便于阅读,在'(* arrow).id'之上选择'arrow-> id'。 – 2013-02-28 21:11:58

+0

您正在按值向量传递'toAdd',因此您正在接收向量及其内容的副本。然后你正在使用向量元素的地址:'&(toAdd.at(i))'。当你离开函数时,vector的拷贝被破坏,指针不再有效。改变'addScheme'的签名来接受引用 – 2013-02-28 21:20:57

回答

0

发生这种情况是因为矢量toAdd是按值传递而不是通过引用传递的。会发生什么是您传递到addScheme函数的向量被复制到堆栈。

现在,声明(&(toAdd.at(0))和类似声明采用矢量中位置0的任何参考。这意味着它返回一个指向栈上位置的指针。

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

要解决这个问题,要么通过引用传递向量,要么更好地避免(&(toAdd.at(0)),因为这是一个非常奇怪的契约,可能永远不会按照您的预期工作。

+0

David的那个向量 - 这真的是我读过的最有用的东西,用于回答我的问题,我第一次看到100%回答我的问题的答案 - 不仅仅是为了帮我做作业,但帮助我学习。非常感谢你! – user1311736 2013-03-01 03:22:52

+0

我很高兴我能帮到 – 2013-03-01 06:22:41

+0

哦 - 对 - 阿隆。我现在看到大卫刚刚编辑它。对不起,仍然是堆栈溢出noobie。谢谢! – user1311736 2013-03-01 20:24:53

相关问题