## Trivial Example The c ```c #include #include // compile with gcc -o a.so a.c typedef struct { int x; } X; X* create() { X *x = (X*)malloc(sizeof(X)); x->x = 42; return x; } int set(X* x, int y) { x->x = y; } int get(X* x) { return x->x; } void destroy(X* x) { free(x); } ``` The pyton ```python import ctypes dll = ctypes.cdll.LoadLibrary("./a.so") print(dll) class X: def __init__(self): self.a = dll.create() # void* pointers are just integers in Python def destroy(self): dll.destroy(self.a) def set(self,x): # we should be putting on type annotations in real code x = int(x) dll.set(self.a,x) def get(self): return dll.get(self.a) x = X() print(x.get()) ```