我想在 Python 脚本的共享库中调用我的 C 函数。传递指针时出现问题,64 位地址似乎在被调用函数内被截断为 32 位地址。Python 和我的库都是 64 位的。
下面的示例代码演示了该问题。Python 脚本打印传递给 C 函数的数据的地址。然后,从调用的 C 函数中打印接收到的地址。另外,C 函数通过打印本地创建内存的大小和地址来证明它是 64 位的。如果指针以任何其他方式使用,则结果是段错误。
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
add_library(plate MODULE plate.c)
盘子.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))
python-2.7的输出
在 [1] 中:运行 ../test_plate.py
传递地址:7f9a09b02320
传递地址:0x9b02320
本地指针大小:8
本地指针地址:0x7f9a0949a400