假设我有一个结构,它是一个列表,例如
typedef struct mylist {
int head;
int tail;
int size;
buckets_t *bucketslots;
} mylist_t;
然后
void create_list(mylist_t* list, int size) {
list->head = 0;
list->tail = 0;
list->size = size;
list->bucketslots = malloc(sizeof(bucket_t) * size);
}
现在,在我的主要方法中,如果我执行:
mylist_t list1;
create_list(&list1, 1000);
倒数第二行是否自动为 list1 分配空间?或者,我是否需要通过
显式分配空间malloc(sizeof(mylist_t))
?
我真正想知道的是,这是否是创建 mylist 类型的结构并开始在 main 中使用它的有效过程。
编辑
当我声明倒数第二行时,C 似乎将 list1 放入堆栈,但它没有进入堆。如果我想把它放在堆上,我应该做以下事情吗? :
mylist_t* create_list(int size) {
mylist_t list1 = malloc(sizeof(mylist_t));
list->head = 0;
list->tail = 0;
list->size = size;
list->bucketslots = malloc(sizeof(bucket_t) * size);
return list1;
}
然后调用函数:
create_list(1000);
有了这个,我可以在整个程序中访问 list1 吗?
最佳答案
当你写作时
mylist_t list1;
create_list(&list1, 1000);
list1
分配在堆栈上,该结构包含一个指针。 struct1 中的成员未初始化。
一般情况下,create_list
函数会为指向的指针分配空间并初始化结构
堆总是需要用 malloc/calloc 显式分配。另一方面,堆栈是自动的。
关于c - C 中的空初始化会自动 malloc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34110806/