c - C 中的空初始化会自动 malloc 吗?

标签 c

假设我有一个结构,它是一个列表,例如

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/

相关文章:

c - 传递并编辑字符串中的特定字符

c - 数组存储在内存中的什么位置?

c - 为什么 valgrind 在调用 `pcap_open_offline` 时会报告内存泄漏?

c - 修复 ms 编译器 c 代码以在 gcc 中编译

c - 斐波那契递归

c - 在 windows 中使用在 cygwin 上编译的 linux 代码进行生产是否可以?

c++ - 在 x64 中我们可以通过 malloc() 获得多少内存?

objective-c - ARC Objective-C 中的 C 风格多维数组

c - 这是跨翻译单元内联函数的合理技巧吗?

c - 为什么我不能取消引用指向多维数组的指针?