【发布时间】:2019-09-27 15:49:05
【问题描述】:
我一直在尝试通过 ctypes 将 char** 数组返回到我的 Python 代码中。我有一种“有效”的方法,但我不喜欢它,因为我必须在 Python 端有一些额外的代码。我必须相信这是可能的。
我的 Python 代码:
from ctypes import *
strarray = POINTER(c_char_p)
getStr = cdll.context.getStrings
getStr.argtypes = [c_char_p, strarray]
fname = b"test.ctx"
names = strarray()
int numStrs = getStr(fname, names)
for i in range(numStrs):
print(names[i])
我的 C/C++ 代码:
int getStrings(char* fname, char **names)
{
int count;
int strSize;
count = getNameCount();
names = (char**) malloc(sizeof(char*) * count);
for (int i = 0; i < count; i++)
{
std::string name = getName(i);
strsize = name.length() + 1;
*names = (char*) malloc(strsize *sizeof(char));
strcpy_s(*parts, strsize, name.c_str());
*names++;
}
return count;
}
当我尝试在 Python 中打印出 names 时,我得到了 ValueError: NULL pointer access。
正如我所说,我有这样的作品。在 Python 中,如果我不使用 POINTER(c_char_p) 而是指定一些指针,如 c_char_p*4096 并从 C 代码中删除 malloc,我可以得到很好的结果。不过,理想情况下,我想在 C 端分配内存。我觉得我缺少一些微妙之处。
我正在使用 Python 3.5.2,以防万一。
【问题讨论】: