C语言链表作为函数参数传递问题:平均身高计算失败排查
问题排查:链表平均身高计算函数调用失败
问题描述
C程序实现了存储患者信息的链表功能,main函数内计算患者平均身高的逻辑正常,但调用外部avr_height函数时执行失败,怀疑是指针理解或链表传递方式有误。
错误原因定位
avr_height函数的核心错误是指针类型不匹配导致的非法内存访问:
- 函数参数
InpList是LIST_HEAD*类型(指向链表头结构体的指针),但代码中直接将其赋值给NODE*类型的pTemp,这会让指针指向错误的内存区域,遍历链表时触发非法访问。 - 正确逻辑应该是从
InpList->pFirst_elmt获取链表的第一个节点指针,再开始遍历。
修正后的avr_height函数代码
void avr_height(LIST_HEAD *InpList) { int iNumb = 0; int iSum = 0; int iCurrent = 0; float fAvrageH = 0; NODE *pTemp = NULL; // 修正:从链表头结构体中获取第一个节点的指针 pTemp = InpList->pFirst_elmt; while(pTemp != NULL) { iCurrent = pTemp->Patient.iHeight; iSum = iSum + iCurrent; pTemp = pTemp->next; iNumb++; } // 新增空链表判断,避免除以0的运行时错误 if(iNumb == 0){ printf("No patients in the database, cannot calculate average height.\n"); return; } fAvrageH = ((float)iSum) / ((float)iNumb); // 统一输出格式,保留两位小数 printf("The average height of these patients is: %.2f\n", fAvrageH); }
额外优化说明
- 增加空链表判断逻辑,避免数据库无患者时出现除以0的运行时错误。
- 调整输出格式为
%.2f,和main函数内的输出保持一致,提升结果可读性。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

