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

我的 C++ 代码是

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

我的功能是

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

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

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

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

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

ffi.cast("void*",address)

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

【问题讨论】:

    标签: c++ python-2.7 python-cffi


    【解决方案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]?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多