我在我工作的项目中看到了下一个代码:
struct Str
{
size_t count;
T data[1];
};
Str* str = (Str*)malloc(sizeof(Str) + sizeof(T) * count);
str->count = count
...
从这一点开始, str->data
用作count
元素T
的数组。
为什么要声明T data[1]
而不是T* data
?这样做有什么好处吗?
答案 0 :(得分:2)
您的代码无效C ++。
然而,它是有效的C,有点。在C中编写此标准的标准方法是将最终成员声明为T data[];
(“灵活长度数组”),目的是允许您分配一个单独的动态内存块并存储两个固定的标题和可变长度数组在一起。
使用这种类型有几个限制(例如,它不能是自动变量或数组元素的类型)。请参阅示例the GCC implementation,它提供了几种非标准扩展。