簡體   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