在C语言中如何为结构体分配指针?示例代码是否会触发未定义行为?标准合规的写法是什么?
C语言结构体指针分配与代码合规性解答
嘿,先直接给你结论:你贴的这段代码完全符合C语言标准,不会触发任何未定义行为。
为什么这段代码是安全的?
- 你通过
malloc(sizeof(struct foo))为struct foo*类型的指针bar申请了恰好能容纳一个struct foo实例的内存空间,这是C标准明确允许的内存分配方式。 - 后续调用
free(bar)正确释放了这块内存——哪怕极端情况下malloc返回NULL(内存分配失败),free(NULL)也是C标准认可的安全操作,不会产生问题。
优化建议:让代码更健壮
如果想让代码在可维护性和安全性上更上一层楼,可以做这两处调整:
- 用
sizeof(*bar)替代sizeof(struct foo):这样就算后续你修改了结构体的名称,或者指针的类型,这行代码也不用跟着改,减少出错概率。 - 增加内存分配失败的判断:
malloc并非总能成功,在内存不足时会返回NULL,如果直接对NULL指针解引用才会触发未定义行为,加上判断能提前处理这种异常情况。
优化后的代码示例:
#include <stdlib.h> struct foo{ int a; }; int main(int argc, char ** argv){ struct foo * bar = malloc(sizeof(*bar)); if (bar == NULL) { // 检查内存分配是否成功 return EXIT_FAILURE; } // 这里可以正常使用结构体指针,比如给成员赋值:bar->a = 42; free(bar); bar = NULL; // 释放后置空,避免出现野指针 return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者John Friendson




