1: что происходит
ctypes адаптирует строку Python, правильно предполагая, что функция принимает char*
. Фактически, libx.foo("string")
эквивалентен второму примеру libx.foo(c_char_p("string"))
с небольшой адаптацией во время выполнения.
Ваша интуиция о том, что строка является сборщиком мусора вскоре после вызова, верна. Ничто в Python не сохраняет ссылку на адаптированное представление строки c_char_p, и, таким образом, оно будет возвращено в пул объектов - вероятно, будет переиздано в будущем. Это означает, что char* c_ptr
, вероятно, очень скоро укажет на мусор.
2: разные по своему действию
Вторая форма позволяет вам сохранить ссылку на представление, переданное в функцию C. Если вы немного изменили пример:
>>> s = c_char_p("string")
>>> libx.foo(s)
Тогда, пока ссылка поддерживается на s
, значение c_ptr
будет действительным. Это можно сделать, просто сохранив ссылку в модуле, реализующем привязку к libx.