Почему значение указателя CString изменяется при печати из C? - PullRequest
0 голосов
/ 08 декабря 2018

Я вызываю функцию Rust из C, но адрес указателя изменяется при возврате.

#[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.

Кто-нибудь знает, в чем может быть проблема?

1 Ответ

0 голосов
/ 08 декабря 2018

В вашем коде C нет прототипа для plugin_get_config_string.Таким образом, компилятор делает вывод, что тип возвращаемого значения int.Когда это int затем присваивается переменной char *, int расширяется до знака, потому что char * больше, чем int на вашей целевой платформе.

Применяется та же причинак параметрам функции: они неявно определены как int, так что ваши указатели, приходящие из C, будут усечены, а аргументы могут быть в неправильном месте из-за несоответствия размера.

Чтобы это исправить, выдолжен объявить прототип так:

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