如何在C中使用灵活数组来保留多个值?

use*_*316 0 c arrays

我有以下代码:

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)

我如何使用它作为一个灵活的数组来保存五个变量的所有值?

Lun*_*din 6

要正确执行此操作,您应该将灵活数组成员声明为不完整类型:

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"的原因.他们不可靠,只是一个可能或可能不起作用的肮脏的黑客.