Copying void * string to

eryk sun eryksun at gmail.com
Wed Feb 10 19:23:24 EST 2016


On Wed, Feb 10, 2016 at 6:07 AM, Martin Phillips
<martinphillips at ladybridge.com> wrote:
>
> Several functions in the C library return pointers to dynamically allocated w_char null
> terminated strings. I need to copy the string to a Python variable and call an existing
> library function that will free the dynamically allocate memory.
>
> My test code for this is
>
> def Test(fno, item):
>     func = mylib. MyFunc
>     func.restype = ct.c_void_p
>     s = func(fno, item)
>     result = s
>     mylib.free(s)
>     return result
>
> The problem is with the line that sets the result variable. I need this to make a copy of
> the dynamically allocated string, not the pointer to it.

There are several options, but I think the simplest is to use a
subclass of ctypes.c_wchar_p. subclasses of simple types don't get
converted automatically. Copy the string using the "value" attribute.
Then free() the pointer. But only copy and free the result if it isn't
NULL (i.e. a false boolean value).

    import ctypes

    mylib = ctypes.CDLL('path/to/mylib')

    class MyLibError(Exception):
        pass

    class my_wchar_p(ctypes.c_wchar_p):
        pass

    mylib.MyFunc.restype = my_wchar_p

    def test(fno, item):
        s = mylib.MyFunc(fno, item)
        if s:
            result = s.value
            mylib.free(s)
            return result
        raise MyLibError('mylib.MyFunc returned NULL')


More information about the Python-list mailing list