【发布时间】:2020-08-22 19:01:24
【问题描述】:
我有一个 C 函数,它读取二进制文件并返回一个动态大小的无符号整数数组(大小基于二进制文件中的元数据):
//example.c
#include <stdio.h>
#include <stdlib.h>
__declspec(dllexport)unsigned int *read_data(char *filename, size_t* array_size){
FILE *f = fopen(filename, "rb");
fread(array_size, sizeof(size_t), 1, f);
unsigned int *array = (unsigned int *)malloc(*array_size * sizeof(unsigned int));
fread(array, sizeof(unsigned int), *array_size, f);
fclose(f);
return array;
}
这个answer 似乎在说将创建的数组从 C 传递到 Python 的正确方法是这样的:
# example_wrap.py
from ctypes import *
import os
os.add_dll_directory(os.getcwd())
indexer_dll = CDLL("example.dll")
def read_data(filename):
filename = bytes(filename, 'utf-8')
size = c_size_t()
ptr = indexer_dll.read_data(filename, byref(size))
return ptr[:size]
但是,当我运行 python 包装器时,代码在ptr[:size] 处静默失败,就好像我试图越界访问数组一样,我可能是,但是传递这个动态大小的正确方法是什么数组?
【问题讨论】:
-
您在 python 代码中调用的
indexer_dll.read_index()的定义在哪里? -
在贴出的 C 代码中。哦,抱歉,我正在重命名并减少我的代码以使其更通用,但我错过了更改该名称。