C语言 如何使用函数创建结构体的多个示例?

hs1rzwqc  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(172)

我需要创建一个结构体的唯一示例,并在不使用malloc的情况下返回其地址。
问题是每次我调用创建struct示例的函数时,示例的地址都是相同的。
List. h内部

typedef struct List_s List;
struct List_s{
    Node* next; 
};

在List. c内

List* List_Create(){
    static List head; 

    printf("%p\n", &head); <--- In both function calls prints out the same address

    return NULL; 
}

int main(void){

    List_Create(); 
    List_Create(); // I  

}

我试过不使用static关键字,但也出现了同样的问题。另外,我把初始化的列表结构体放在函数外部,没有出现问题,但我需要在函数内部完成它。

pjngdqdw

pjngdqdw1#

这是一个非常简单的实现,它使用一个固定大小的静态数组,并返回一个指向其中一个元素的指针。

List* List_Create(){
    static List lists[MAX_LISTS];
    static int index = 0;

    if (index >= MAX_LISTS) {
        return NULL;
    }
    // initialze contents of lists[index] here
    return &lists[index++];
}

如果你还需要销毁列表到池中,你需要把lists设为一个全局变量,这样它就可以被List_CreateList_Destroy使用,并且你需要一些方法来跟踪哪些元素被销毁了,你可以把每个List Package 在另一个有in_use成员的结构体中。

u0njafvf

u0njafvf2#

通过使用static,只有一个示例,其生存期为进程的持续时间。
如果没有static,你将创建一个示例,其生存期为该特定调用的持续时间。返回一个指向该示例的指针是无效的,它的内存可供重用。
若要在没有堆分配的情况下执行此操作,则需要示例池。

#define MAX_LISTS 200 

List* List_Create( void )
{
    static List list_pool[MAX_LISTS] ;
    static size_t next_list = 0 ;

    List* list = NULL ;
    if( next_list < MAX_LISTS )
    {
        list = &list_pool[next_list] ; 
    }

    return list ; 
}

上面是一个非常粗糙的例子,它没有返回列表到池的方法,这可能是一个要求。要做到这一点,你需要把static移到函数之外,并有一个标记元素已使用/未使用的方法,以及一个在“创建”时搜索未使用元素的方法。然而,关键是你需要一个池,具体的执行情况,我想不在这个问题的范围之内。

相关问题