Есть libx.поэтому
, который экспортирует 2 функции, и struct
,
typedef struct Tag {
int num;
char *name;
}Tag;
Tag *create(int n, char *n)
{
Tag *t = malloc(sizeof(Tag));
t->num = n;
t->name = n;
return t;
}
void use(Tag *t)
{
printf("%d, %s\n", t->num, t->name);
}
Я хочу вызвать create
в Python, а затем сохранить Tag * res
, возвращенный create
, позже я вызову use
и передам сохраненный ранее Tag * res
в use
, вот он (просто для демонстрации) :
>>>libx = ctypes.CDLL("./libx.so")
>>>res = libx.create(c_int(1), c_char_p("a"))
>>>libx.use(res)
Приведенный выше код может быть неправильным, просто чтобы продемонстрировать, что я хочу сделать.
И моя проблема в том, как я могу сохранить результат, возвращенный create
? Поскольку он возвращает указатель на определяемую пользователем структуру
, и я не хочу создавать аналог struct Tag
в Python, c_void_p
выполняет трюк?
ОБНОВЛЕНИЕ
Из ответа @David я все еще не совсем понимаю одну вещь:
указатель (
c_char_p ("a")
) действителен только в течение в вызовсоздать
. Как только create вернется, этот указатель не будет дольше действителен.
И я назначаю c_char_p ("a")
на t-> name
в create
, когда вызов create
завершается , является ли t-> name
висячим указателем? Потому что, согласно процитированным словам, этот указатель больше недействителен после create
. Почему c_char_p ("a")
больше не действует?