Python przekazuje adres wskaźnika 32-bitowego do funkcji C

Chciałbym wywołać moje funkcje C w bibliotece współdzielonej ze skryptów Pythona. Problem pojawia się przy przekazywaniu wskaźników, adresy 64-bitowe wydają się być obcięte do 32-bitowych adresów w wywoływanej funkcji. Zarówno Python, jak i moja biblioteka są 64-bitowe.

Poniższe przykładowe kody pokazują problem. Skrypt Pythona wyświetla adres danych przekazywanych do funkcji C. Następnie otrzymany adres jest drukowany w ramach wywoływanej funkcji C. Dodatkowo funkcja C udowadnia, że ​​jest 64-bitowa, drukując rozmiar i adres lokalnej pamięci. Jeśli wskaźnik jest używany w inny sposób, wynikiem jest segfault.

CMakeLists.txt

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

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

Wyjście z python-2.7

W [1]: uruchom ../test_plate.py

przekazujący adres: 7f9a09b02320

przekazany adres: 0x9b02320

lokalny rozmiar wskaźnika: 8

adres lokalnego wskaźnika: 0x7f9a0949a400

questionAnswers(4)

yourAnswerToTheQuestion