Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-CAPI:将C字符串打包到元组时遇到问题_Python_C_Python C Api - Fatal编程技术网

Python-CAPI:将C字符串打包到元组时遇到问题

Python-CAPI:将C字符串打包到元组时遇到问题,python,c,python-c-api,Python,C,Python C Api,在下面的代码中,我试图将两个以null结尾的C字符串(字符指针)打包到一个Python元组中 printf("word1 = '%s', word2 = '%s'\n", words1->wordArray[i], words2->wordArray[i]); cmpArgs = Py_BuildValue("ss", words1->wordArray[i], words2->wordArray[i]); printf("%s\n", PyString_AsString

在下面的代码中,我试图将两个以null结尾的C字符串(字符指针)打包到一个Python元组中

printf("word1 = '%s', word2 = '%s'\n", words1->wordArray[i], words2->wordArray[i]);
cmpArgs = Py_BuildValue("ss", words1->wordArray[i], words2->wordArray[i]);
printf("%s\n", PyString_AsString(PyTuple_GetItem(cmpArgs, 0)));
这将产生如下输出:

word1 = '20', word2 = '20'
i┴

为什么元组中的字符串与元组外的字符串不同?我做错了什么?另外,我是否需要担心增加和减少这个元组的引用计数?(我创建它是为了传递给作为PyObject*传递给C的Python函数)

我想我得到了它——我以前使用堆栈空间以一种奇怪的方式存储单词。我开始在堆上手动为它们分配空间,这似乎已经解决了这个问题。

我想我得到了它——我以前使用堆栈空间以一种奇怪的方式存储单词。我开始在堆上手动为它们分配空间,这似乎已经解决了问题。

您的代码看起来是正确的。您是否包含了?您是否在编译时打开了所有警告(
-Wall
带gcc)?有时忘记包含会导致生成的代码错误地将指针参数传递给变量函数,例如
Py\u BuildValue
。打开警告有助于捕获此类错误(以及其他许多错误)。此外,如果将
Py\u BuildValue(…)
替换为
cmpArgs=PyTuple\u New(2);PyTuple_SetItem(cmpArgs,0,PyString_FromString(words1->wordArray[i]);PyTuple_SetItem(cmpArgs,1,PyString_FromString(words2->wordArray[i]);
?如果这有帮助,它会指向
Py_BuildValue
被阻塞,可能是由于缺少或损坏的头。我还需要哪些头?(我包括在内)尝试您的代码会将字符串弄得一团糟,并导致它进入无限循环。我是否会错误地计算引用?您的代码看起来是正确的。您是否
#include
?是否在编译时启用了所有警告(
-Wall
with gcc)?有时忘记一个
#include
会导致生成的代码错误地将指针参数传递给变量函数,例如
Py\u BuildValue
。打开警告有助于捕获此类错误(以及许多其他错误)。此外,如果将
Py\u BuildValue(…)
替换为
cmpArgs=PyTuple\u New(2)是否也有帮助PyTuple_SetItem(cmpArgs,0,PyString_FromString(words1->wordArray[i]);PyTuple_SetItem(cmpArgs,1,PyString_FromString(words2->wordArray[i]);
?如果这有帮助,它会指向
Py_BuildValue
被阻塞,可能是由于缺少或损坏的头。我还需要哪些头?(我包括在内)尝试你的代码会把字符串弄得乱七八糟,并导致它进入无限循环。我是否会错误地计算引用数?