函数指针引发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; }
段错误核心原因
语句缺失分号:
Init函数里的Add(MyLoop)末尾没有加分号,这会导致编译器解析代码时出现逻辑错误。部分编译器不会直接抛出编译错误,但会生成不符合预期的机器码,最终导致全局函数指针mpfStateMachine没有被正确赋值为MyLoop的地址,始终是空指针。调用空指针指向的函数必然触发段错误。函数返回类型不规范:
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
相关产品推荐
相关产品推荐

