This is a sticky and exotic use-case of ctypes. In the example below, we make a call to some library function that treats ptr
like a double-pointer, and sets ptr
to point to a buffer and sets count
with the number of bytes that are available there. The data at the pointer may have one or more NULL bytes that should not be interpreted as terminators.
from ctypes import * ptr = ctypes.c_char_p() count = ctypes.c_size_t() r = library.some_call( ctypes.cast(ctypes.byref(ptr), ctypes.POINTER(ctypes.c_void_p)), ctypes.byref(count)) if r != 0: raise ValueError("Library call failed.") data = ctypes.string_at(ptr, count.value)