Python передает адрес 32-битного указателя в функции C

Я хотел бы вызывать свои функции C в общей библиотеке из скриптов Python. Проблемы, возникающие при передаче указателей, 64-битные адреса кажутся усеченными до 32-битных адресов в вызываемой функции. И Python, и моя библиотека 64-битные.

Приведенные ниже примеры кода демонстрируют проблему. Скрипт Python печатает адрес данных, передаваемых в функцию C. Затем полученный адрес печатается из вызываемой функции C. Кроме того, функция C доказывает, что она 64-битная, печатая размер и адрес локально создаваемой памяти. Если указатель используется любым другим способом, результатом является ошибка.

CMakeLists.txt

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

plate.c

#include 
#include 

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))

Выход из python-2.7

В [1]: запустите ../test_plate.py

проходящий адрес: 7f9a09b02320

переданный адрес: 0x9b02320

размер локального указателя: 8

адрес локального указателя: 0x7f9a0949a400

Ответы на вопрос(4)

Ваш ответ на вопрос