代码之家  ›  专栏  ›  技术社区  ›  St.Antario

从函数返回指向结构的指针

  •  1
  • St.Antario  · 技术社区  · 7 年前

    我使用了一些声明一些不透明类型的库。我将此类型包装到自己的结构中,以抽象此库不透明类型,但遇到了一些问题。以下是代码:

    typedef struct my_struct my_struct;
    struct my_struct{
        opaque_lib_t *const opaque_lib_ptr; //opaque_lib_t is the opaque type
                                            //came from the library
    };
    
    my_struct* initialize(){
        opaque_lib_t *opaque_lib_ptr;
        init(&opaque_lib_ptr);              //library function call
        return opaque_lib_ptr;
    }
    
    void use_and_release(my_struct *my_struct_ptr){
         //use and release my_struct
    }
    
    my_struct *my_struct_ptr =  initialize();
    use_and_release(my_struct_ptr);         //crashes
    

    在这样的实现中 use_and_release 撞车。所以我试着替换 my_struct* initialize 通过以下实现

    my_struct* initialize(){
         opaque_lib_t *opaque_lib_ptr;
         init(&opaque_lib_ptr);
         my_struct *my_struct_ptr = malloc(sizeof(*my_struct_ptr));
         my_struct tmp = {.opaque_lib_ptr = opaque_lib_ptr};
         memcpy(my_struct_ptr, &tmp, sizeof(tmp));
         return my_struct_ptr;
    }
    

    opaque_lib_t* 投给 my_struct* 我的结构* 只包含一个元素。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Some programmer dude    7 年前

    您尝试使用第一个示例的原因是尝试模拟来自面向对象语言的继承。好像你想要 my_struct 与…有“是”的关系 opaque_lib_t

    但是,这不会起作用,因为这样您就需要 我的结构 实例 结构,即它应该是

    struct my_struct{
        opaque_lib_t opaque_lib_instance;   //opaque_lib_t is the opaque type
                                            //came from the library
    };
    

    真的是一个匿名和不透明的结构类似于 FILE 那就不可能了。

    记忆中 看起来像

    my_struct             opaque_lib_t
    +----------------+    +-------------------+
    | opaque_lib_ptr | -> | Unknown data      |
    +----------------+    | More unknown data |
                          | ...               |
                          +-------------------+
    

    在上面 .

    当你这么做的时候 return opaque_lib_ptr; 你实际上是在说“这个指针指向一个 谁的第一个成员是指向的指针 这完全是错误的,因为这是两种截然不同的结构。

    如果您尝试使用 my_struct_ptr->opaque_lib_ptr 那么您访问的内存就是 不透明库 结构(返回其指针)。


    最后说说你说的

    在我的代码中,我想对特定的库结构进行抽象

    我能理解,但这已经是我们的目的了 . 在抽象之上添加(不必要的)抽象。

    我可以理解你的结构,如果它收集 倍数 不透明库 指针。