【发布时间】:2011-09-17 10:24:56
【问题描述】:
在一个 C++ 开源项目中,我看到了这个。
struct SomeClass {
...
size_t data_length;
char data[1];
...
}
这样做而不是使用指针有什么好处?
struct SomeClass {
...
size_t data_length;
char* data;
...
}
我唯一能想到的是大小为 1 的数组版本,用户不应该看到 NULL。还有什么吗?
【问题讨论】:
-
这比指针有很多潜在的好处,但我想不出一个简单的
char。 -
这是可变长度结构的 ISO C90 习惯用法。你是对的,因为指针会做同样的事情,但是这个允许更舒适的访问。在 ISO C99 中,您将使用空括号。单元素数组也适用于 C++,我不确定空括号是否也适用(尽管 gcc 确实支持它)。
-
@larsman:如果你想要一个可变大小的数组,而不需要第二次内存分配的开销。
-
@larsmans:简单地说明标准中的某些内容(C99 中的灵活数组成员,或者在这种情况下最接近它们的 C89 或 C++ 近似值)“几乎没有好处”可能准确地代表您的意见,但可能没有帮助,除非你说明为什么它是错误的。我猜你可能会说,“它是 C++,使用向量”,响应是“与 C API 接口”,所以我的问题仍然是“为什么这在 C 中没有好处”,因此,“为什么灵活数组成员是 C99 的错误特征?”