Существует libx.so
, который экспортирует 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
, и я не хочу создавать аналог struct Tag
в Python, c_void_p
справится?
UPDATE
Из ответа @ Дэвида я до сих пор не совсем понял одну вещь:
указатель (c_char_p("a")
) действителен только в течение
позвоните на create
. Как только create возвращает, этот указатель не
дольше действителен.
И я присваиваю c_char_p("a")
t->name
в create
, когда завершается вызов create
, является ли t->name
висящим указателем? Потому что, согласно приведенным словам, этот указатель больше не действителен после create
. Почему c_char_p("a")
больше не действителен?