CLion运行C++链表树程序调用函数即报exit code139(SIGSEGV)错误
报错根因
C++全局作用域声明的指针变量,会被默认零初始化,也就是说你定义的Tree *root;和Tree *temp;,初始值都是nullptr,没有指向任何合法的Tree对象内存。
你写的所有自定义函数,都没有做指针有效性校验就直接解引用空指针:
add函数直接执行root->data = c,相当于尝试往内存地址0的位置写数据,属于非法内存访问,直接触发SIGSEGV信号,表现为exit code 139addR、addL函数虽然会为新节点申请堆内存,但最后一步要执行root->right = temp/root->left = temp,同样是解引用空的root指针,哪怕新节点的内存申请成功,这行操作一样会触发段错误
你说移除add('a')程序就正常,是因为这时候main函数只执行了打印2的逻辑,全程没有触碰无效指针,自然不会触发内存违规。
最小修复方案
在第一次操作root之前,必须先为其申请合法内存,不能直接拿空指针访问成员:
void add(char c) { // 若root为空,先创建根节点 if (root == nullptr) { root = new Tree(); } root->data = c; }
注意事项:
- 后续调用
addR、addL之前,必须保证root已经指向合法的树节点,否则这两个函数里的root->xxx操作依然会触发段错误 - 目前用全局变量存树节点和临时遍历指针的写法,后续实现括号表达式解析转树的逻辑时,很容易出现指针覆盖、内存泄漏的问题,建议后续把树结构的指针封装为类的私有成员,减少全局变量的依赖
内容的提问来源于stack exchange,提问作者Mohammad javad。
相关产品推荐
相关产品推荐

