so I get segfault from ctypes on a 32-bit Linux machine, which I cannot play on 64-bit darwin or linux.
Here is C:
typedef struct { void *ptr; } doodle; doodle C_intpointerfunction(int *a) { *a = 41; doodle foo; foo.ptr = a; return foo; }
which compiled with:
gcc -c intpointerlibrary.c gcc -shared intpointerlibrary.o -o libintpointerlib.so
and here is Python:
import numpy as N from ctypes import * _libintpointer = N.ctypeslib.load_library('libintpointerlib.so','.') _libintpointer.C_intpointerfunction.restype = c_void_p _libintpointer.C_intpointerfunction.argtypes = [POINTER(c_int)] def P_intpointerfunction(): lrc = c_int(0) print "lrc before (should be 0) = "+str(lrc.value) return_val = _libintpointer.C_intpointerfunction(byref(lrc)) print "lrc after (should be 41) = "+str(lrc.value) return return_val
so now when i call this function:
rc = P_intpointerfunction()
I get segfault. I tried to create a Python class to wrap the returned structure created on the C side with the same results. If you return the native ctypes type (e.g. c_int), everything works fine. Is it really just a 32-bit Linux problem or something that I have not considered? Thanks!
source share