如何在 CFFI 中找到指向结构的指针的地址并将其转换为 void**

Posted

技术标签:

【中文标题】如何在 CFFI 中找到指向结构的指针的地址并将其转换为 void**【英文标题】:How to find address of a pointer to structure and cast it to void** in CFFI 【发布时间】:2016-11-26 14:36:28 【问题描述】:

我的 C++ 代码是

StructureEx* obj; // structure
functionEx((void**)&obj);

我的功能是

int functionEx(void** obj); //calling function

我是 CFFI 的新手。所以我的问题是

    如何在 CFFI 中实现同样的效果?

    CFFI中如何找到指针、结构指针的地址?

我知道投射到void** 可以通过

ffi.cast("void*",address)

但是我怎样才能得到那个地址并传递给函数呢?

【问题讨论】:

【参考方案1】:

可以声明arg = ffi.new("void **") 可能可用。

以下代码打印

7

即首先指针的值为零,调用后的值对应functionEx中设置的值。

from cffi import FFI

ffi = FFI()
ffi.cdef("""int functionEx(void** obj);""")

C = ffi.dlopen("./foo.so")
print(C)
arg = ffi.new("void **")
print(arg[0])
C.functionEx(arg)
print(arg[0])
ints = ffi.cast("int *", arg[0])
print(ints[7])
#include <stdio.h>
#include <stdlib.h>

int functionEx(void ** obj)

    int * arr;
    int i;

    *obj = malloc(sizeof(int) * 8);

    arr = *obj;
    for (i=0; i<8; i++) 
        arr[i] = i;
    

    return 0;

【讨论】:

感谢哈卡拉如此清晰的解释。您能否解释一下下面所述的特定情况是否有效 1)我已经为变量 struct_object 分配了结构的内存,它向我显示 2)创建了一个 void** 变量 void_object=cfg_cffi.ffi .new("void**") 3) 将结构变量的内存分配给 void** void_object[0]=struct_object 4) 现在为问题中所述的函数传递 void_object[0] 程序没有错误但返回 - 1 根据实施情况,这是特定的失败条件。 您是否尝试过传递void_object 而不是void_object[0]

以上是关于如何在 CFFI 中找到指向结构的指针的地址并将其转换为 void**的主要内容,如果未能解决你的问题,请参考以下文章

使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法

如何连接两个指向字符串的指针并将其存储在数组或字符中?

如何删除一棵普通二叉树的叶子结点?

如何初始化指向结构的指针数组?

c语言如何输出指针所指向的值

C++:如何获取浮点指针的地址并将其转换为 void**