为何传递枚举与结构体至函数时程序出现报错?
问题分析与解决方案:结构体指针未初始化导致程序崩溃
兄弟,你的程序崩溃根源太明显了——你声明的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
相关产品推荐
相关产品推荐

