【发布时间】:2019-02-11 00:57:01
【问题描述】:
考虑一个包含灵活数组成员的结构,如下所示:
typedef struct {
size_t len;
char data[];
} Foo;
我有一个未知数量的 Foo,每个都是未知大小,但是我可以确定我所有的 Foo 加起来正好是 1024 字节。 如何在知道每个 Foo 的长度之前为一个 Foos 数组分配 1024 字节,然后再填充数组的成员?
类似这样的东西,虽然它会引发段错误:
Foo *array = malloc(1024);
int array_size = 0;
Foo foo1;
strcpy(foo1.data, "bar");
array[0] = foo1;
array_size++;
Foo foo2;
strcpy(foo2.data, "bar");
array[1] = foo2;
array_size++;
for (int i = 0; i < array_size; i++)
puts(array[i].data);
想要这样做的原因是将所有 Foo 保存在一个连续的内存区域中,以便 CPU 缓存友好。
【问题讨论】:
-
以灵活数组作为最后一个成员的结构不能用作其他结构的成员或数组元素。
-
建议更改:
char data[];到char *data; Then the variable length data can be elsewhere rather than 'in line'. This it is easy to declare an array of those structs, similar to:Foo myArray[ 1024/sizeof( Foo ) ];` 注意:发布的结构代码不包含“标签”名称,大多数调试器使用“标签” ' 名称以便能够访问结构中的各个字段 -
@Govind Parmar 是否有另一种方法来创建具有可变数据大小的结构的内存连续数组?
-
您的方法的一个明显问题是不能保证每个后续的
Foo都会适当地对齐。对齐通常需要填充,如果您已经计算了准确的存储量,则没有填充空间。 -
没有取消引用?好的,然后为
data数组分配最大空间量。当数据数组很短时,这会浪费很多空间,但消除了取消引用。我唯一看到取消引用是一个问题是在尝试“序列化”结构以写入文件时
标签: c memory flexible-array-member