Python está pasando la dirección del puntero de 32 bits a las funciones C

Me gustaría llamar a mis funciones de C dentro de una biblioteca compartida desde scripts de Python. El problema surge cuando se pasan punteros, las direcciones de 64 bits parecen estar truncadas a direcciones de 32 bits dentro de la función llamada. Tanto Python como mi biblioteca son de 64 bits.

Los códigos de ejemplo a continuación demuestran el problema. El script de Python imprime la dirección de los datos que se pasan a la función C. Luego, la dirección recibida se imprime desde dentro de la función C llamada. Además, la función C prueba que es de 64 bits imprimiendo el tamaño y la dirección de la memoria de creación local. Si el puntero se utiliza de otra manera, el resultado es un error de seguridad.

CMakeLists.txt

cmake_minimum_required (VERSION 2.6) 
add_library(plate MODULE plate.c)

placa.c

#include <stdio.h>
#include <stdlib.h>

void plate(float *in, float *out, int cnt)
{
    void *ptr = malloc(1024);
    fprintf(stderr, "passed address: %p\n", in);
    fprintf(stderr, "local pointer size: %lu\n local pointer address: %p\n", sizeof(void *), ptr);
    free(ptr);
}

test_plate.py

import numpy
import scipy
import ctypes

N = 3
x = numpy.ones(N, dtype=numpy.float32)
y = numpy.ones(N, dtype=numpy.float32)
plate = ctypes.cdll.LoadLibrary('libplate.so')

print 'passing address: %0x' % x.ctypes.data
plate.plate(x.ctypes.data, y.ctypes.data, ctypes.c_int(N))

Salida de python-2.7

En [1]: ejecute ../test_plate.py

Dirección de paso: 7f9a09b02320

dirección pasada: 0x9b02320

tamaño de puntero local: 8

Dirección del puntero local: 0x7f9a0949a400

Respuestas a la pregunta(4)

Su respuesta a la pregunta