我正在用 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);
}
回答具体问题:是的,即使尚未分配
sizeof(*(list.items))
,也可以写list.items
,因为sizeof
的结果仅取决于操作数的类型,并且操作数不会被评估,除非它是可变长度数组类型(在这种情况下不能是)。
C17 标准 6.5.3.4-2 中对此进行了规定:
sizeof 运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或 带括号的类型名称。大小由操作数的类型确定。结果 是一个整数。如果操作数的类型是变长数组类型,则对操作数求值; 否则,不计算操作数,结果是整数常量。