如何在生锈中创建并传递以空值终止的C字符串数组(char**)?

Ant*_*ope 9 arrays c-str rust

我正在使用一个新的init系统#![no_std]extern crate rlibcasm进行系统调用,并且当前也试图不分配内存.因此,我所拥有的可能工具的范围是有限的.

我需要调用execve系统调用,它需要a char** argv和a char **envp.我可以将c风格的字符串作为零的字节数组合在一起,但是我怎么能无效地终止静态声明的这样的列表(最后一个指针是NULL)

Ant*_*ope 5

在睡觉之后,我醒了回答,现在我觉得很明显.使用整数切片并将最后一个设置为0.

// Execute something as an example:
let filename: &[u8] = b"/usr/bin/sensors\x00";     // <-- Make c strings like this
let argv1: &[u8] = b"/usr/bin/sensors\x00";
let argv2: &[u8] = b"-h\x00";
let argv: &[int] = [                               // <-- store them in this
    ::core::intrinsics::transmute(argv1.as_ptr()), // <-- transmuting 
    ::core::intrinsics::transmute(argv2.as_ptr()),
    0                                              // <-- and NULL terminate
];
let envp: &[int] = [0];

::linux64::execve(filename,argv,envp);
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`*const u8`而不是`int`.`as_ptr()`方法已经返回一个`*const u8`,所以你可以删除`transmute`.要获得空指针,请使用`ptr :: null()`(或`0 as*const T`)而不是'0`. (2认同)