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)