You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的大小,正是因为编译器只关注类型,不访问实际内存

额外注意事项

  1. 如果items是void*类型,*list.items会触发编译错误(void类型无法解引用),但你的代码中items是具体的type*,不存在这个问题
  2. 建议在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:14