链表指定索引节点获取:索引越界引发段错误的问题排查
链表节点获取函数的段错误修复方案
原代码的问题分析
- 无符号整数判断无效:
index是unsigned int类型,它的取值范围是≥0,所以index < 0的判断永远不会触发,属于无效代码。 - 边界判断遗漏:循环结束后,
i的值等于链表的节点总数(比如链表有3个节点,循环结束时i=3),此时如果index == i也属于超出链表范围,但原代码只判断了index > i,漏掉了这种相等的情况。 - 冗余判断逻辑:当循环遍历完所有节点(
temp == NULL)时,说明指定索引的节点不存在,此时直接返回NULL即可,不需要额外的条件判断。
修正后的代码
listint_t *get_nodeint_at_index(listint_t *head, unsigned int index) { listint_t *temp; unsigned int i; i = 0; temp = head; while (temp != NULL) { if (index == i) { return temp; } temp = temp->next; i++; } // 遍历完所有节点仍未找到,直接返回NULL return NULL; }
修复说明
- 移除了无效的
index < 0判断,因为无符号整数不可能小于0。 - 去掉了多余的
index > i判断,因为循环结束意味着已经遍历完所有节点,无论index是等于还是大于i,都属于无效索引,直接返回NULL即可。 - 简化了逻辑,让代码更清晰,同时彻底避免了因索引超出范围导致的段错误——因为永远不会访问
NULL指针的next成员。
内容的提问来源于stack exchange,提问作者Stanley
相关产品推荐
相关产品推荐

