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

为何传递枚举与结构体至函数时程序出现报错?

问题分析与解决方案:结构体指针未初始化导致程序崩溃

兄弟,你的程序崩溃根源太明显了——你声明的Game *game;只是一个空指针,根本没指向任何有效的内存空间!

你想想,指针就像个地址标签,你只创建了标签,却没给它贴到任何实际的“房子”(内存块)上,直接在new_game函数里用game->mode这种方式去赋值,本质是在瞎写内存,系统肯定会直接终止程序来保护内存安全。

而且你说函数里能正常打印mode和field,这很正常——这俩是直接传值的枚举变量,存在函数的栈空间里,和指针没关系,但结构体指针的解引用才是崩溃的真凶。

给你两种靠谱的解决办法:

方法一:用动态内存分配(堆内存)

适合需要长期持有结构体对象的场景,记得用完要释放内存:

// 先给指针分配一块足够存Game结构体的内存
Game *game = (Game*)malloc(sizeof(Game));
// 一定要检查分配是否成功,避免空指针
if (game == NULL) {
    perror("内存分配失败");
    exit(EXIT_FAILURE);
}
// 现在指针指向有效内存了,放心调用函数
new_game(game, mode, field);

// 用完结构体后,记得释放内存,避免内存泄漏
free(game);
game = NULL; // 把指针置空,防止变成野指针

方法二:用栈上的结构体变量(更简单)

如果结构体不需要长期存在,用栈内存更省心,不用手动释放:

// 直接在栈上声明一个Game类型的变量,系统会自动分配内存
Game game;
// 调用函数时,传这个变量的地址给指针参数
new_game(&game, mode, field);
// 之后直接用game.x、game.mode这些成员就行,不用管内存释放

另外,建议给new_game函数加个空指针检查,避免以后再踩类似的坑:

void new_game(Game *game, GameMode mode, Field field) {
    // 先判断指针是否有效
    if (game == NULL) {
        printf("错误:传入的game指针是空的!\n");
        return;
    }
    game->mode = mode;
    game->field = field;
    game->x = game->field;
    game->y = game->field;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:53:12