C++ 向量和分段错误
Posted
技术标签:
【中文标题】C++ 向量和分段错误【英文标题】:C++ vector and segmentation faults 【发布时间】:2012-04-08 05:26:36 【问题描述】:我正在开发一个简单的数学解析器。只是写着number = 1 + 2;
我有一个包含这些标记的向量。它们存储字符的类型和字符串值。我正在尝试逐步通过向量来构建这些标记的 AST,并且我不断遇到分段错误,即使我认为我的代码应该防止这种情况发生。
这是构建 AST 的代码:
struct ASTGen
const vector<Token> &Tokens;
unsigned int size,
pointer;
ASTGen(const vector<Token> &t) : Tokens(t), pointer(0)
size = Tokens.size() - 1;
unsigned int next()
return pointer + 1;
Node* Statement()
if(next() <= size)
switch(Tokens[next()].type)
case EQUALS
:
Node* n = Assignment_Expr();
return n;
advance();
void advance()
if(next() <= size) ++pointer;
Node* Assignment_Expr()
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
Node* Expression()
if(next() <= size)
advance();
if(Tokens[next()].type == SEMICOLON)
Node* n = new Node(Tokens[pointer], NULL, NULL);
return n;
if(Tokens[next()].type == PLUS)
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
;
...
ASTGen AST(Tokens);
Node* Tree = AST.Statement();
cout << Tree->Right->Data.svalue << endl;
我可以访问Tree->Data.svalue
并获取=
节点的令牌信息,因此我知道该节点正在生成,我还可以获取Tree->Left->Data.svalue
并获取=
左侧的变量
我已经重写了很多次尝试不同的方法来遍历向量,但是当我尝试访问 =
右节点(应该是 +
节点)时,我总是遇到分段错误
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:还有很多我们没有看到的代码,所以我不能准确地告诉你发生了什么,但我看到了一些值得关注的事情。一是 Statement() 方法并不总是返回一个值。如果第一个if
测试没有通过,那么我们调用advance()
并在没有显式返回的情况下从例程的底部跌落。调用者将尝试获取函数的返回值,但它会得到垃圾。这可能会导致各种问题,包括两次free()
调用等,很容易导致段错误。
Expression()
也有同样的问题。
【讨论】:
他的Expression()
函数也有不返回值的代码路径。
我确实意识到了这一点,但现在我并不担心,因为这应该对 number = 1 + 2;
正常工作,或者至少,这是希望。一旦我可以解决这个测试用例,我将完成其他控制路径。
@Headspin:调高编译器的警告级别。你可能在其他地方也有类似的可疑之处。
感谢 Blastfurnace 的建议。我用-Wall
编译并且能够看到错误。谢谢欧内斯特。由于出现了警告级别,我能够看到我在没有返回类型的情况下到达了控制路径的尽头。我会确保以后不再假设这些事情。以上是关于C++ 向量和分段错误的主要内容,如果未能解决你的问题,请参考以下文章