C宏中如何确定结构体元素类型?sizeof未分配指针合法性疑问
关于动态数组初始化中
sizeof(*list.items)的合规性问题 你的写法完全符合C标准,是安全且推荐的实践,原因如下:
核心原理:sizeof是编译时运算符
sizeof的作用是计算表达式的类型大小,它在编译阶段就完成计算,不会对表达式进行实际求值。也就是说:
- 哪怕
list.items是未初始化的野指针或NULL,*list.items也不会被实际解引用(不会触发内存访问) - 编译器只会根据
list.items的指针类型,推导它指向的元素类型,然后返回该类型的字节数
结合你的代码分析
在你的typedef_list宏中,items被定义为type*类型,因此*list.items的类型就是type,sizeof(*list.items)等价于sizeof(type)。但前者的优势在于:
- 如果后续修改
items的类型(比如不小心写错类型),这个写法会自动适配,无需手动修改sizeof的参数,降低出错概率 - 你的测试代码中,
arr是局部变量,items未初始化(值为随机垃圾值),但sizeof(*arr.items)依然能正确输出uint16_t的大小,正是因为编译器只关注类型,不访问实际内存
额外注意事项
- 如果
items是void*类型,*list.items会触发编译错误(void类型无法解引用),但你的代码中items是具体的type*,不存在这个问题 - 建议在
list_init宏中添加malloc返回值检查,同时初始化元素数量为0,避免后续逻辑出错,例如:
#define list_init(list, cap) \ do { \ list.items = malloc(cap * sizeof(*list.items)); \ if (list.items == NULL) { \ /* 处理内存分配失败,比如设置cap为0 */ \ list.cap = 0; \ list.n = 0; \ break; \ } \ list.cap = cap; \ list.n = 0; \ } while (0);
内容的提问来源于stack exchange,提问作者vs07
相关产品推荐
相关产品推荐

