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