Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 C-API中的C代码将ptr返回给堆栈变量。我错过了什么?_Python_C_Python C Api_Python C Extension - Fatal编程技术网

看起来Python C-API中的C代码将ptr返回给堆栈变量。我错过了什么?

看起来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

我正在阅读methodobject.c文件,因为我正试图学习如何为Python制作c扩展,这时我看到了以下代码片段:

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所指出的,不要感觉太糟糕;函数指针语法可能会令人困惑。谢谢。我现在觉得有点傻,不过稍微不那么困惑了。谢谢。我现在觉得有点傻,不过稍微不那么困惑了。谢谢。我真的把头撞到墙上了。现在我觉得问这个问题有点傻,但我要花一段时间才能理解我的误解。谢谢。我真的把头撞到墙上了。现在我觉得问这个问题有点傻,但我要花一段时间才能理解我的误解。