我有以下代码:
typedef struct
{
int name;
int info[1];
} Data;
Run Code Online (Sandbox Code Playgroud)
那么我有五个变量:
int a, b, c, d, e;
Run Code Online (Sandbox Code Playgroud)
我如何使用它作为一个灵活的数组来保存五个变量的所有值?
要正确执行此操作,您应该将灵活数组成员声明为不完整类型:
typedef struct
{
int name;
int info[];
} Data;
Run Code Online (Sandbox Code Playgroud)
然后动态分配内存
Data* data = malloc(sizeof(Data) + sizeof(int[N]));
for(int i=0; i<N; i++)
{
data->info[i] = something; // now use it just as any other array
}
Run Code Online (Sandbox Code Playgroud)
编辑
确保您使用C99编译器才能工作,否则您将遇到各种问题:
如果你分配一个长度为1的数组,那么你将malloc 1项作为数组的第一个元素和struct一起,然后N
在那之后附加字节.这意味着你实际上是在分配N+1
字节.这可能不是人们想要做的事情,它使事情变得不必要地复杂化.
(为了解决上述问题,GCC有一个允许零长度数组的C99前扩展,这在标准C中是不允许的.)
在C99之前,或者在作为灵活数组成员的任何其他上下文中,C不允许不完整的数组类型,如我的代码中所示.
C99保证在使用灵活的阵列成员时您的程序是明确定义的.如果不使用C99,则编译器可能会在其他结构成员和最后一个数组之间附加"struct padding"字节.这意味着data->info[0]
可以指向结构填充字节,而不是指向已分配数组中的第一项.这可能会导致各种奇怪的,意外的行为.
这就是灵活数组成员在C99之前被称为"struct hack"的原因.他们不可靠,只是一个可能或可能不起作用的肮脏的黑客.