我需要创建一个结构体的唯一示例,并在不使用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关键字,但也出现了同样的问题。另外,我把初始化的列表结构体放在函数外部,没有出现问题,但我需要在函数内部完成它。
2条答案
按热度按时间pjngdqdw1#
这是一个非常简单的实现,它使用一个固定大小的静态数组,并返回一个指向其中一个元素的指针。
如果你还需要销毁列表到池中,你需要把
lists
设为一个全局变量,这样它就可以被List_Create
和List_Destroy
使用,并且你需要一些方法来跟踪哪些元素被销毁了,你可以把每个List
Package 在另一个有in_use
成员的结构体中。u0njafvf2#
通过使用
static
,只有一个示例,其生存期为进程的持续时间。如果没有
static
,你将创建一个示例,其生存期为该特定调用的持续时间。返回一个指向该示例的指针是无效的,它的内存可供重用。若要在没有堆分配的情况下执行此操作,则需要示例池。
上面是一个非常粗糙的例子,它没有返回列表到池的方法,这可能是一个要求。要做到这一点,你需要把
static
移到函数之外,并有一个标记元素已使用/未使用的方法,以及一个在“创建”时搜索未使用元素的方法。然而,关键是你需要一个池,具体的执行情况,我想不在这个问题的范围之内。