繁体   English   中英

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

[英]Returning a pointer to a structure from function

我使用了一些声明了一些不透明类型的库。 我将这种类型包装到我自己的结构中,以抽象出这个库的opaque类型,并遇到了一些问题。 这是代码:

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*并将其opaque_lib_t*my_struct*因为my_struct*只包含一个元素。

为什么尝试使用第一个示例尝试模拟面向对象语言的继承。 您似乎希望my_structopaque_lib_t具有“is a”关系。

但是这不会起作用,因为那时你需要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
};

如果opaque_lib_t确实是一个类似于FILE的匿名和不透明结构,那么这是不可能的。

另一种看待方式是这样的:

在内存中my_struct看起来像

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

您根本无法在my_struct上覆盖opaque_lib_t

当你确实return opaque_lib_ptr; 你实际上是在说“这个指针指向一个my_struct它的第一个成员是指向opaque_lib_t的指针”。 这是完全错误的,因为这是两个非常不同的结构。

继续第一段代码,如果您尝试使用my_struct_ptr->opaque_lib_ptr那么您访问的内存是opaque_lib_t结构的初始数据(您返回的指针)。


关于你说的话

在我的代码中,我想抽象出特定的库结构

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

如果它收集了多个相关数据,我可以理解你的结构,但不仅仅是opaque_lib_t指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM