[英]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_struct
与opaque_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.