如何确定 C 宏中结构体中元素的类型? [重复]

问题描述 投票:0回答:1

我正在用 C 创建一个动态数组。我还想创建一个函数,用一定数量的元素初始化给定的动态数组。然而,在确定内存分配的每个元素的大小时,我不知道到底该怎么做。

这是我的代码:

#define typedef_list(name, type)    \
        typedef struct {            \
                int cap;            \
                int n;              \
                type *items;        \
        } name;                                                                                             

#define list_init(list, cap)                                                              \
        do {                                                                              \
                list.items = malloc(cap * sizeof(*list.items));   /* problem line */  \
                list.cap = cap;                                                        \
        } while (0);

#endif

我使用

sizeof(*list.items)
来获取所指向的任何内容的大小。它似乎有效,因为以下宏适用于给定类型:

#define list_test(list) do { printf("%lu\n", sizeof(*(list.items))); } while(0);

这样做可以接受吗,因为技术上内存尚未分配?我的猜测是编译器并没有尝试访问该内存,而是只是“知道”大小,但这好吗?

编辑 - 这是我用来测试这个的代码:

typedef_list(dyn, uint16_t);  // works with any given type

int main(void) {
        dyn arr; 
        list_test(arr);
}
c macros
1个回答
0
投票

回答具体问题:是的,即使尚未分配

sizeof(*(list.items))
,也可以写
list.items
,因为
sizeof
的结果仅取决于操作数的类型,并且操作数不会被评估,除非它是可变长度数组类型(在这种情况下不能是)。

C17 标准 6.5.3.4-2 中对此进行了规定:

sizeof 运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或 带括号的类型名称。大小由操作数的类型确定。结果 是一个整数。如果操作数的类型是变长数组类型,则对操作数求值; 否则,不计算操作数,结果是整数常量。

© www.soinside.com 2019 - 2024. All rights reserved.