Если вы выделите память в Python, вы можете реализовать более прямо, как показано ниже. Обратите внимание, что я использовал Python 3 и явно передавал байтовые строки.
test.c
#include <stdio.h>
#include <stdlib.h>
#define API __declspec(dllexport) // Windows-specific export
API void myprint(const char* input, char* output)
{
printf("hello world\n");
printf("input string: %s\n",input);
sprintf(output,"Life is cheap\n");
printf("output string in C program: %s\n",output);
}
test.py
import ctypes
testlib = ctypes.CDLL('test')
mem = ctypes.create_string_buffer(32)
testlib.myprint(b'hell with the world',mem)
print(mem.value)
выход
hello world
input string: hell with the world
output string in C program: Life is cheap
b'Life is cheap\n'
Если вы все еще хотите, чтобы C выделял память, вам нужно будет предоставить функцию для ее освобождения, если вы не хотите утечки:
test.c
#include <stdio.h>
#include <stdlib.h>
#define API __declspec(dllexport) // Windows-specific export
API void myprint(const char* input, char** output)
{
printf("hello world\n");
printf("input string: %s\n",input);
*output = malloc(32);
printf("output address: %p\n",*output);
sprintf(*output,"Life is cheap\n");
printf("output string in C program: %s\n",*output);
}
API void myfree(char* mem)
{
printf("freeing %p\n",mem);
free(mem);
}
test.py
import ctypes
testlib = ctypes.CDLL('test')
# allocate a pointer to hold the result
mem = ctypes.c_char_p()
# Pass it by reference to be modified
testlib.myprint(b'hell with the world',ctypes.byref(mem))
print(mem.value)
testlib.myfree(mem)
выход
hello world
input string: hell with the world
output address: 0000028CEE9BAE50
output string in C program: Life is cheap
b'Life is cheap\n'
freeing 0000028CEE9BAE50