调试器指向教授提供的函数定义时,段错误根源在哪?
问题分析与解答
核心结论
这个段错误主要是教授提供的函数定义本身的问题,你的调用代码大概率没有问题,具体原因如下:
无限递归导致栈溢出
你贴出的函数代码存在致命逻辑错误:static LexItem GetNextToken(istream& in, int& line) { if( pushed_back ) { pushed_back = false; return pushed_token; } return GetNextToken(in, line); // 无限递归调用自身 }当全局/静态变量
pushed_back为false时,函数会无终止地递归调用自己,每次递归都会占用栈空间,最终栈空间耗尽,触发操作系统抛出的SIGSEGV段错误——这和你gdb里显示错误发生在return GetNextToken(in, line);行完全吻合。依赖的全局变量未正确初始化
这个函数依赖pushed_back和pushed_token两个全局/静态变量,如果这些变量没有被正确初始化(比如pushed_back默认就是false,或者pushed_token是未构造的无效对象),会直接触发上面的无限递归逻辑。调用方参数无明显问题
从gdb输出line=@0x63fef0: 1可以看出,line的内存地址有效,值也正常;istream& in的引用也没有明显异常,所以你这边的调用参数大概率不是问题根源。
内容的提问来源于stack exchange,提问作者J P
相关产品推荐
相关产品推荐

