我有以下用例。C 中的结构体如下所示:typedef struct _zend_internal_arg_info { const char *name; zend_type type; zend_uchar pass_by_reference; zend_bool is_variadic;} zend_internal_arg_info;通常该name字段包含一个函数名称。但是由于内部实现,这个字段也可以携带一个整数。在 C 端有一个宏在做这样的转换:(const char*)(unsigned long int)(1)我想要做的是在 Rust 端做同样的转换。我最终得到了以下代码:fn create_null_argument(required_args: u8, return_reference: bool) -> ZendFunctionArgument { let required_args_ref = Box::into_raw(Box::new(required_args as i8)) as *const i8; ZendFunctionArgument { arg: php_bindings::_zend_internal_arg_info { name: required_args_ref, type_: 0, pass_by_reference: if return_reference { 1 } else { 0 }, is_variadic: 0, }, }}这似乎适用于以下测试:let arguments_ptr = ZendFunctionArguments::new(5, true).into_raw();unsafe { let arguments: Vec<php_bindings::_zend_internal_arg_info> = Vec::from_raw_parts(arguments_ptr as *mut _, 1, 1); let required_args = *arguments[0].name; assert_eq!(5, required_args);}不幸的是,在 PHP 端(执行代码时),每次执行时该值都是完全随机的。我想在这里问的是,与在 C 端 ( (const char*)(unsigned long int)(1))上的转换相比,我转换 i8 的方式是否正确?
1 回答
- 1 回答
- 0 关注
- 272 浏览
添加回答
举报
0/150
提交
取消