C语言栈上全零初始化结构体指针的写法是否符合预期?
问题结论
你当前编写的move_stats *mv_s = (move_stats *){0};无法实现预期效果,属于会触发未定义行为的错误写法,不能得到指向全字段为0的move_stats结构体的合法指针。
错误原因
你使用的是C语言复合字面量语法,但你传入的类型是指针类型move_stats*,初始化值0的作用是把这个指针本身初始化为空指针值,根本没有创建你需要的move_stats结构体实例。后续如果通过这个mv_s指针访问结构体成员,本质是空指针解引用,会直接触发内存访问错误。
符合需求的正确写法
根据你描述的使用场景(结构体仅在当前函数调用生命周期内使用,不需要跨作用域共享),有两种等价的正确写法:
写法1:结构体复合字面量直接取地址
最贴合你"直接给指针赋值"的使用习惯,块作用域内的复合字面量为自动存储期,生命周期从定义点持续到当前代码块结束,完全匹配你的使用要求:
// 注意复合字面量的类型是结构体类型move_stats,而非指针类型 move_stats *mv_s = &(move_stats){0};
C标准明确规定,对聚合类型(结构体、数组)使用{0}作为初始化列表时,第一个成员会被初始化为0,剩余所有未显式赋值的成员都会被递归初始化为对应类型的0值:
- 三个
byte(即unsigned char)类型字段值为0 - 两个
bool类型字段值为false
完全满足你"所有字段均初始化为0"的要求。
写法2:先定义局部结构体变量再取地址
如果对复合字面量语法不熟悉,用普通局部变量写法效果完全一致,同样不需要手动管理内存:
move_stats mv_s_storage = {0}; move_stats *mv_s = &mv_s_storage;
额外提示
该场景不需要使用malloc做堆内存分配,栈上分配的结构体没有额外内存开销,也不会出现内存泄漏问题,更适合你当前的使用场景。
内容的提问来源于stack exchange,提问作者John Saylor
相关产品推荐
相关产品推荐

