gpt4 book ai didi

c - 为什么从 C 打印时 CString 指针值会改变?

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:22 25 4
gpt4 key购买 nike

我正在从 C 调用 Rust 函数,但指针地址在返回时发生了变化。

#[no_mangle]
pub extern fn plugin_get_config_string(config: *const toml::Value, k: *const c_char) -> *const c_char {
let a = CString::new("dwadwad").unwrap();
let p = a.as_ptr();
println!("{:?}", p);
mem::forget(a);
p
}
__declspec(dllexport) void initialize(void *config) {
char *dwad = plugin_get_config_string(config, "host");
printf("%p\n", dwad);
}

在 Rust 中:0x220d3ceee30

在 C 中:FFFFFFFFD3CEEE30

前 3 个字节在 C 中总是被剥离。

我正在使用 Visual Studio 2017 x64 Dev 命令提示符和 stable-x86_64-pc-windows-msvc。

有人知道问题出在哪里吗?

最佳答案

在您的 C 代码中,没有 plugin_get_config_string 的原型(prototype)。因此,编译器推断返回类型为 int。当 int 被分配给 char * 变量时,int 被符号扩展,因为 char *大于目标平台上的 int

同样的推理也适用于函数的参数:它们被隐式定义为 int,因此来自 C 的指针将被截断,并且由于大小不匹配,参数可能位于错误的位置.

要解决这个问题,您必须像这样声明一个原型(prototype):

const char *plugin_get_config_string(const void *config, const char *k);

关于c - 为什么从 C 打印时 CString 指针值会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com