C语言如何正确初始化game_state结构体中的4x4二维int数组?
代码错误分析及修正方案
核心错误点
- 类型不匹配赋值:
board是int类型二维数组,NULL是指针类型空值,将NULL赋值给int类型成员属于典型类型错误,你表述的“初始化为空”实际是指数组元素值为0,直接赋值0即可,不应该使用NULL。 - 内存分配逻辑错误:从你的代码写法可以推断
game_state是struct game_state_int*的类型别名,此时要分两种场景判断逻辑合理性:- 如果函数设计是调用方预先分配好
struct game_state_int内存,传入其地址作为参数,那你完全不需要调用malloc,额外申请的内存会造成泄漏,且调用方传入的原有内存根本没有被初始化,这是你程序其余部分出现异常的核心原因。 - 如果函数设计是内部完成内存分配、通过输出参数返回给调用方,
malloc逻辑本身没问题,但需要补充内存分配失败的校验逻辑。
- 如果函数设计是调用方预先分配好
- 冗余操作:固定大小的int数组初始化全0,不需要双重循环遍历赋值,直接用
memset清零整个结构体即可,效率更高也不易出错。
修正后的代码
场景1:调用方预先分配结构体内存,函数仅做初始化
此时game_state是struct game_state_int的类型别名,不需要malloc:
#include <string.h> void init_game_state(game_state* gp) { memset(gp, 0, sizeof(game_state)); }
场景2:函数内部完成内存分配并通过参数返回
此时game_state是struct game_state_int*的类型别名:
#include <stdlib.h> #include <string.h> void init_game_state(game_state* gp) { *gp = malloc(sizeof(struct game_state_int)); // 必须加内存分配失败校验 if (*gp == NULL) { return; } memset(*gp, 0, sizeof(struct game_state_int)); }
内容的提问来源于stack exchange,提问作者Blither
相关产品推荐
相关产品推荐

