C 锈迹斑斑的结构清晰排列

C 锈迹斑斑的结构清晰排列,c,arrays,struct,rust,migration,C,Arrays,Struct,Rust,Migration,我正在研究把C程序移植到Rust上的可能性。 有可能在Rust中复制此C代码吗 struct myStruct { int var1; int var2; char var3[32]; int var4; } int main() { struct myStruct myArray[1000]; bzero((char*) myArray,sizeof(myArray)); // clear entire array myArray[0].var1 = 42;

我正在研究把C程序移植到Rust上的可能性。 有可能在Rust中复制此C代码吗

struct myStruct {
  int  var1;
  int  var2;
  char var3[32];
  int  var4;
}

int main() {
  struct myStruct myArray[1000];
  bzero((char*) myArray,sizeof(myArray)); // clear entire array
  myArray[0].var1 = 42;
  sprintf(myArray[0].var3, "Hello World!");
 /* other code here */
}

我尝试过各种方法,但都出现了编译错误。

与其分配大数组和归零项,不如使用Vec之类的工具,并在创建它们时将项插入其中。Rust通常不使用零初始化结构原理,因此您可以根据需要创建项,并且可以保证结构中只存储有效项。虽然在C语言中,将未初始化或部分初始化的数据填充到数据结构中是很常见的,但Rust更喜欢只包含完全初始化的有效数据,这有助于保持安全保证

您可能希望让您的结构有一个构造函数,以确保它完全初始化,以及访问器。或者,如果不向其他代码公开该结构,则可以手动初始化它

如果您很清楚需要提前分配多少项,那么可以使用Vec::with_capacity提前执行分配。即使您的估计值有点太低,这也会很有帮助,因为结构可以在运行时扩展,只是效率较低。根据您的分配行为,向量可能是有益的,但缺点是您无法将其转换为切片

如果您的数据结构更像一个哈希映射或集合(无论是否排序),那么std::collections下的集合可能会更好地满足您的需要。

由于您的结构非常容易复制,并且只包含默认值为0的类型,您可以简单地派生默认值并使用数组文字:

[衍生复制、克隆、默认] 结构MyStruct{ var1:i64, var2:[u8;32], var3:i64, var4:i64, } fn干线{ 让数组=[MyStruct::default;1000]; } 可以使用bzero进行0初始化的结构很可能总是复制的,因此可以使用数组文本


但是请注意,在Rust中,这很可能是不规则的,使用Vec可能会被认为更好,如中所述。

Rust和C有非常不同的编程范例。因此,你不能也不应该盲目地将一个功能翻译成另一个功能,而应该根据目标语言的原则重新实现所需的功能。我理解这一点。我读过关于生锈的书,也玩过一些,我只是不知道如何重新实现结构数组。我理解它需要是可变的,以及所有权是如何工作的,但在我的搜索中,将其清除为null似乎一点也不明显。即使对其他问题给出的答案也无法编译。结构数组本身没有任何用途。它只是用于实现特定功能的数据结构。在Rust中,您可能希望为该功能使用其他数据结构。数组在main的第1行声明,然后在下一行清零。该阵列现在可以存储1000行myStruct。不知道它是如何毫无用处的。当数据可用时,程序将慢慢填充数据。它就像内存中的数据库,可以很容易地进行搜索和索引。如果阵列不是为此目的设计的,您能解释一下您将使用什么来实现该功能吗?仅供参考,这里有一个Rust等价物: