在我的Python程序的C扩展中,我试图通过将主C函数(称为数百万次)的两个输入设置为全局变量来提高性能,因为它们不会经常更改,所以我不必一直使用lambda封装将它们从Python函数提供给C函数(这浪费了大量的时间)。我的代码看起来像这样。C-Python扩展中的全局PyObject *变量
unsigned char* splitArray;
PyObject* wordCmp;
然后Python的API函数来设置它们::第一I在该文件的顶部声明全局变量
static PyObject* py_set_globals(PyObject *self, PyObject *args)
{
free(wordCmp);
free(splitArray);
char* splitChars;
PyObject* wordC;
if (!PyArg_ParseTuple(args, "sO", &splitChars, &wordC))
return NULL;
wordCmp = (PyObject*)malloc(sizeof(PyObject));
memcpy(wordCmp, wordC, sizeof(PyObject));
splitArray = splitchars_to_mapping(splitChars);
return Py_BuildValue("");
}
在这种情况下,splitArray被分配给128个字符阵列,其在函数splitchars_to_mapping中是malloc的,而wordCmp是一个传递给C的Python函数对象。无论如何,就我所知,char * splitArray可以很好地作为全局变量,但是当我稍后尝试调用wordCmp使用PyEval_CallObject,Python/C崩溃。所以我有两个问题:
- 为什么C不会立即崩溃当我尝试释放未初始化的指针wordCmp和splitArray在函数的开始?
- 为什么我以后在我将它正确地存储在堆上并将其引用为全局引用时无法调用wordCmp?
好吧,谢谢。所以我的声明等价于“unsigned char * splitArray = NULL; PyObject * wordCmp = NULL;”? – dpitch40
@ dpitch40是的,这是由标准保证,看到这个答案http://stackoverflow.com/a/6212973/1157444 – iabdalkader
@ dpitch40检查更新的答案 – iabdalkader