看起来Python C-API中的C代码将ptr返回给堆栈变量。我错过了什么?
我正在阅读methodobject.c文件,因为我正试图学习如何为Python制作c扩展,这时我看到了以下代码片段:看起来Python C-API中的C代码将ptr返回给堆栈变量。我错过了什么?,python,c,python-c-api,python-c-extension,Python,C,Python C Api,Python C Extension,我正在阅读methodobject.c文件,因为我正试图学习如何为Python制作c扩展,这时我看到了以下代码片段: PyObject * PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyOb
PyObject *
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
{
PyCFunctionObject* f = (PyCFunctionObject*)func;
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
Py_ssize_t size;
switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
case METH_VARARGS:
if (kw == NULL || PyDict_Size(kw) == 0)
return (*meth)(self, arg);
break;
我看得越多
return (*meth)(self, arg);
我越是意识到我不明白。我认为它返回了一个指向meth的指针,meth是一个函数,它将self作为本地声明的指针,arg作为外部传递到PyCFunctionCall的指针。然而,在我看来,似乎meth&self是在堆栈上分配的,一旦PyCFunctionCall退出,它们就会被释放,这将导致传递给它们的变量出现问题
我在这里遗漏了什么?meth是一个函数指针。它返回函数*meth处的结果,meth指向的地址带有参数:self,arg meth是一个函数指针。它返回函数*meth处的结果,meth指向的地址带有参数:self,arg 它返回的是methself的返回值arg,而不是meth本身。注意,它使用*meth去引用指针,然后将self和arg传递给该位置的函数 因此,在返回之前,将完全评估methself、arg,并且不会返回任何堆栈变量
编辑:当我说methself,arg时,我指的是由methself,arg指向的函数。它返回的是methself,arg的返回值,而不是meth本身。注意,它使用*meth去引用指针,然后将self和arg传递给该位置的函数 因此,在返回之前,将完全评估methself、arg,并且不会返回任何堆栈变量 编辑:当我说methself,arg时,我指的是由methself,arg指向的函数。*methself,arg是一个函数调用 恰好函数指针是一个局部变量。返回仅传递从呼叫返回的任何内容 函数指针语法令人困惑: *methself,arg是一个函数调用 恰好函数指针是一个局部变量。返回仅传递从呼叫返回的任何内容
函数指针语法令人困惑: 啊!!!非常感谢。我觉得自己像个白痴,但至少我现在是个开明的人。这就是为什么我们在这里。正如@ams所指出的,不要感觉太糟糕;函数指针语法可能会混淆。Argh!!!非常感谢。我觉得自己像个白痴,但至少我现在是个开明的人。这就是为什么我们在这里。正如@ams所指出的,不要感觉太糟糕;函数指针语法可能会令人困惑。谢谢。我现在觉得有点傻,不过稍微不那么困惑了。谢谢。我现在觉得有点傻,不过稍微不那么困惑了。谢谢。我真的把头撞到墙上了。现在我觉得问这个问题有点傻,但我要花一段时间才能理解我的误解。谢谢。我真的把头撞到墙上了。现在我觉得问这个问题有点傻,但我要花一段时间才能理解我的误解。