递归函数出现Segmentation Fault的原因:两段代码对比解析
递归函数
displayAllTVShowsOfActor触发Segmentation Fault的原因分析 代码1(触发Segmentation Fault)
void displayAllTVShowsOfActor(TVShow* root, string actor) { string *a = root->actor; if (root != NULL) { while (*a != "NULL") { if (*a == actor) { cout << root->name << endl; } cout << "here"; a = (a+1); } displayAllTVShowsOfActor(root->left, actor); displayAllTVShowsOfActor(root->right, actor); } }
代码2(可正常运行)
void displayAllTVShowsOfActor(TVShow* root, string actor) { string *a; if (root != NULL) { a = root->actor; while (*a != "NULL") { if (*a == actor) { cout << root->name << endl; } cout << "here"; a = (a+1); } displayAllTVShowsOfActor(root->left, actor); displayAllTVShowsOfActor(root->right, actor); } }
错误原因
Segmentation Fault(段错误)的核心原因是访问了空指针指向的内存区域:
- 代码1中,
string *a = root->actor;写在if (root != NULL)判断之前。当递归遍历到二叉树的叶子节点时,root->left或root->right会是NULL,此时调用函数时root参数为空,直接执行root->actor相当于解引用空指针,这会触发内存访问违规,导致段错误。 - 代码2把
a = root->actor;移到了if (root != NULL)内部,确保只有当root不为空时才访问它的actor成员,规避了空指针解引用的问题,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Drizzy Dunks
相关产品推荐
相关产品推荐

