Struct 如何在Rust中实现C灵活数组成员模式?

Struct 如何在Rust中实现C灵活数组成员模式?,struct,rust,Struct,Rust,我想实现这个C代码,它在Rust中使用了一个(有时称为): struct测试{ int键; int-dataSize; int数据[]; }; struct test*t=malloc(sizeof(struct test)+sizeOfData) 结构末尾的空数组允许您一次分配所有的元字段和数据。不幸的是,我不知道如何在Rust中执行此操作。此结构的Rust等价物将使用一个切片: struct测试{ 键:i32, 数据大小:i32, 数据:[i32], } 但是,目前这些类型的使用并不方

我想实现这个C代码,它在Rust中使用了一个(有时称为):

struct测试{
int键;
int-dataSize;
int数据[];
};
struct test*t=malloc(sizeof(struct test)+sizeOfData)

结构末尾的空数组允许您一次分配所有的元字段和数据。不幸的是,我不知道如何在Rust中执行此操作。

此结构的Rust等价物将使用一个切片:

struct测试{
键:i32,
数据大小:i32,
数据:[i32],
}
但是,目前这些类型的使用并不方便,因为没有安全的方法来构建它们

更实用的方法是使用通用的:

struct测试{
键:i32,
数据大小:i32,
数据:T,
}
然后确保只有当
T
是数组或片(只能通过强制创建)时才使用
test

另见:


我认为通过分配器API和大量的
不安全的
,您可以在夜间实现这一点。但是我对它在C中的工作原理还不够熟悉。如果
数据
数组的对齐度大于头的大小会怎样?填充字节是否在
大小的
中计数,或者我们仅仅依靠
malloc
分配更多的数据来满足最大可能的对齐度?@MatthieuM。可能是我的错,因为您无法避免像我说的那样填充字节,sizeof和offsetof必须为FAM生成相同的大小。不,这是错误的,切片包含它们的len,FAM不包含。Rust ATM中没有等效的FAM。@Stargateur
[T]
不包含长度。您所说的
&[T]
是指向切片的胖指针:它包含长度。但不是未调整大小的
[T]
本身。@JL2210胖指针是指针+一些额外数据,例如
&[T]
是胖指针,因为它包含第一个元素的地址+大小,而
&dyn Trait
是一个胖指针,因为它包含一个指向数据的指针+一个指向vtable的指针。@LukasKalbertodt但这在Rust中没有意义,
[T]
需要知道它的大小,如果你需要不安全的话,这对我来说不会是Rust。说[T]是FAM的等价物对我来说是错误的,至少现在是这样!这一切的正确解决方案是什么?至少指向外部类型为最后一个字段的结构的指针不是fat指针。