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

函数指针引发Segmentation Fault问题求助

问题分析与解决

代码整理

File1.c

Init()
{
    Add(MyLoop)  // 注意此处缺少分号
}

void MyLoop(bool)
{
    // does stuff
}

File0.c

int main(void)
{
    Init();
    Run(false);
}

File2.c

void (* mpfStateMachine)(bool);

void Run(bool Irrelevant)
{
    mpfStateMachine(Irrelevant);
}

void Add(void (* func)(bool))
{
    mpfStateMachine = func;
}

段错误核心原因

  1. 语句缺失分号:Init函数里的Add(MyLoop)末尾没有加分号,这会导致编译器解析代码时出现逻辑错误。部分编译器不会直接抛出编译错误,但会生成不符合预期的机器码,最终导致全局函数指针mpfStateMachine没有被正确赋值为MyLoop的地址,始终是空指针。调用空指针指向的函数必然触发段错误。

  2. 函数返回类型不规范:Init函数未声明返回类型,在C99及后续标准中,隐式默认int的写法属于非法语法。兼容旧标准的编译器可能允许这种写法,但可能导致函数调用栈异常,间接影响Add函数的赋值逻辑,使得指针赋值未正确执行。

修复方案

  • 给Add(MyLoop)补上分号:
    Init()
    {
        Add(MyLoop);
    }
    
  • 给Init函数添加显式返回类型(无返回值时声明为void):
    void Init()
    {
        Add(MyLoop);
    }
    
  • 建议给MyLoop的参数添加名称(非强制,但可提升可读性,避免编译器警告):
    void MyLoop(bool flag)
    {
        // does stuff
    }
    

修复后,mpfStateMachine会被正确赋值为MyLoop的函数地址,调用时就不会触发段错误了。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:30:48