gpt4 book ai didi

python - 如何使用 malloc 将 char** 返回到 ctypes

转载 作者:行者123 更新时间:2023-11-30 14:36:19 28 4
gpt4 key购买 nike

我一直在尝试通过 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 中打印名称时,出现ValueError:NULL指针访问

正如我所说,我有一些有用的东西。在Python中,如果我不使用POINTER(c_char_p)但指定一定数量的指针,例如c_char_p*4096并从中删除malloc C代码,我可以得到很好的结果。但理想情况下,我想在 C 端分配内存。我觉得我缺少一些微妙之处。

我正在使用 Python 3.5.2,以防万一。

最佳答案

声明:

names = (char**) malloc(sizeof(char*) * count);

将内存分配给names,但Python中的调用者不会看到这一点。为此,请使用:

*names = (char**) malloc(sizeof(char*) * count);

这意味着您必须将函数声明为:

int getStrings(char* fname, char ***names)

三重间接。

我不知道你需要在Python中更改什么,但至少你必须传递Python names变量的地址。

正确的 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)[i] = (char*) malloc(strsize *sizeof(char));
strcpy_s((*names)[i], strsize, name.c_str());
}
return count;
}

关于python - 如何使用 malloc 将 char** 返回到 ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58137791/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com