C语言while循环中函数指针调用无输出问题求助
问题分析与修复
你的代码核心问题出在while循环的指针操作逻辑上,导致函数调用顺序错乱,甚至触发未定义行为:
错误原因
在while (*list_p++ != 0)中,list_p++是后置自增运算符,执行顺序是:
- 先判断当前
*list_p是否不等于0 - 无论判断结果如何,
list_p都会向后移动一位 - 进入循环体后调用的是移动后指针指向的内容
这就造成两个问题:
- 第一个函数
func_A被判断后直接跳过,从未被调用 - 当循环判断到最后一个有效函数
func_C时,指针会移动到末尾的0(空指针),此时调用(*list_p)()属于调用空指针,是未定义行为,程序可能无输出甚至崩溃
修复方案
有两种简洁的修复方式,任选其一即可:
方案1:先判断调用,再移动指针
调整循环逻辑,先确认当前指针指向有效函数,调用后再移动指针:
void func(list *list_p) { while (*list_p != 0) { (*list_p)(); list_p++; } }
方案2:用临时变量保存当前函数指针
先把当前指针的内容存入临时变量,再移动指针,避免跳过第一个函数:
void func(list *list_p) { list current; while ((current = *list_p++) != 0) { current(); } }
额外优化建议
原代码中printf没有添加换行符,输出会连在一起,建议修改为:
void func_A(){ printf("Hello A\n");} void func_B(){ printf("Hello B\n");} void func_C(){ printf("Hello C\n");}
这样控制台会按行输出,结果更清晰。
内容的提问来源于stack exchange,提问作者St. Bi
相关产品推荐
相关产品推荐

