Arrays 如何在rust中创建并传递以null结尾的C字符串数组(char**)?
我正在玩一个带有Arrays 如何在rust中创建并传递以null结尾的C字符串数组(char**)?,arrays,rust,c-str,Arrays,Rust,C Str,我正在玩一个带有#的新init系统![no_std]和外部板条箱rlibc并使用asm进行系统调用,目前也尝试不分配内存。因此,我拥有的可能工具的范围是有限的 我需要调用execve系统调用,它需要一个char**argv,和一个char**envp。我可以把c风格的字符串拼凑成带零的字节数组,但是我怎么能用null终止这样一个静态声明的列表(最后一个指针为null)?在沉睡于此之后,我醒来时得到了答案,现在我似乎明白了。使用整数切片并将最后一个设置为0 // Execute something
#的新init系统![no_std]
和外部板条箱rlibc
并使用asm进行系统调用,目前也尝试不分配内存。因此,我拥有的可能工具的范围是有限的
我需要调用execve系统调用,它需要一个
char**argv
,和一个char**envp
。我可以把c风格的字符串拼凑成带零的字节数组,但是我怎么能用null终止这样一个静态声明的列表(最后一个指针为null)?在沉睡于此之后,我醒来时得到了答案,现在我似乎明白了。使用整数切片并将最后一个设置为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);
//以执行某件事情为例:
让文件名:&[u8]=b“/usr/bin/sensors\x00”;//您应该使用*const u8
而不是int
。as_ptr()
方法已返回一个*const u8
,因此您可以删除transmute
。要获取空指针,请使用ptr::null()
(或0 as*const T
)而不是0
。此外,您可以在ByTestRing中使用\0
而不是\x00
来表示空字节。您可以自由地将原始指针转换为整数(argv1.as_ptr()as int
),但正如@francisgagne所建议的,最好存储和[*const u8]
。另外,您是否知道使用,同时允许将名称引入范围,例如使用核心::mem。。。mem::transmute(…)
?@FrancisGagné:谢谢你这么说,我希望有人能对这篇文章发表评论types@dbaupp我不知道演员阵容这么简单。是的,我知道如何使用,我现在更喜欢看完整的路径。