gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:19 24 4
gpt4 key购买 nike

我正在阅读文件 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);

关于python - 看起来 Python C-API 中的 C 代码将 ptr 返回到堆栈变量。我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555024/

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