You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言while循环中函数指针调用无输出问题求助

问题分析与修复

你的代码核心问题出在while循环的指针操作逻辑上,导致函数调用顺序错乱,甚至触发未定义行为:

错误原因

在while (*list_p++ != 0)中,list_p++是后置自增运算符,执行顺序是:

  1. 先判断当前*list_p是否不等于0
  2. 无论判断结果如何,list_p都会向后移动一位
  3. 进入循环体后调用的是移动后指针指向的内容

这就造成两个问题:

  • 第一个函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:05:42