我对 C 结构中的灵活长度数组有疑问(http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html)。
typedef struct {
size_t N;
int elems[];
} A_t;
现在一般的方法很明显,
A_t * a = malloc(sizeof(A_t) + sizeof(int) * N)
a->N = N;
....
现在,当尝试将内容合并到其他结构或基于堆栈的分配中时,这似乎很尴尬。所以像下面的片段这样的东西肯定会失败N!=0
struct {
A_t a;
A_t b; /// !!!!!
double c; /// !!!!!
};
现在我认为应该可以通过定义另一种类型来允许这样的用法
typedef struct {
size_t N;
int elems[5];
} A_5_t;
struct {
A_5_t a;
A_5_t b;
double c; // should work here now.
} mystruct;
然后像使用A_t
结构一样使用它。调用函数void foo(A_t * arg1);
时,需要使用类似foo((A_t*) (&mystruct.b))
. 这——对我来说——似乎有点笨拙。因此,我想知道是否有更好的方法来做到这一点。我想知道是否可以为此使用联合类型?
我在问这个问题,因为灵活长度的数组可以将数据放在结构中的一个片段中,因此可以使用单个命令复制结构,而不必担心深拷贝和浅拷贝等。