C中的空初始化是否自动执行malloc?

C中的空初始化是否自动执行malloc?,c,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-&g

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

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空间?或者,我需要显式地通过malloc空间吗

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);
有了这个,我可以在整个程序中访问列表1吗

C永远不会隐式地
malloc()
任何东西


一般来说,每当你遇到这类问题时,(直到你精通这门语言,甚至不再有这类问题为止),记住C语言的哲学是永远不要在背后做任何事情,永远不要做任何你没有明确要求的事情

特别是那些甚至不是语言一部分的东西,比如内存分配。在C语言中,内存分配是运行库的专有问题。这种语言没有内存分配概念的内置知识。

C永远不会隐式地
malloc()


一般来说,每当你遇到这类问题时,(直到你精通这门语言,甚至不再有这类问题为止),记住C语言的哲学是永远不要在背后做任何事情,永远不要做任何你没有明确要求的事情

特别是那些甚至不是语言一部分的东西,比如内存分配。在C语言中,内存分配是运行库的专有问题。该语言没有内存分配概念的内置知识。

当您编写

mylist_t list1;
create_list(&list1, 1000);
list1
在堆栈上分配,结构包含指针。结构1中的成员未初始化

create\u list
函数通常会为指向并初始化结构的指针分配空间

堆始终需要使用malloc/calloc显式分配。另一方面,堆栈是自动的。

当您写入时

mylist_t list1;
create_list(&list1, 1000);
list1
在堆栈上分配,结构包含指针。结构1中的成员未初始化

create\u list
函数通常会为指向并初始化结构的指针分配空间

堆始终需要使用malloc/calloc显式分配。另一方面,堆栈是自动的

第二行到最后一行是否自动为list1分配malloc空间

否。通常创建列表的方法是为节点分配空间,然后根据需要为添加到列表中的每个附加节点分配空间。(无论空间是否动态分配)

初始化
list1
(类型为
mylist\t
的节点)的
head
tail
size
值,然后使用
size
元素为该节点动态分配类型为
bucket\t
的数组。如果这是您的
list1
的全部内容,则您的
list1
已分配

第二行到最后一行是否自动为list1分配malloc空间

否。通常创建列表的方法是为节点分配空间,然后根据需要为添加到列表中的每个附加节点分配空间。(无论空间是否动态分配)


初始化
list1
(类型为
mylist\t
的节点)的
head
tail
size
值,然后使用
size
元素为该节点动态分配类型为
bucket\t
的数组。如果这是您的
列表1的全部
,则您的
列表1
已分配。

您建议的
创建列表
分配和初始化结构的替代方案几乎是正确的:

  • list1
    应定义为指向
    mylist\t
    的指针
  • 桶指针的分配应使用指向
    桶的指针的大小,而不是结构
    桶的大小
  • 您还需要初始化bucket指针数组
以下是修改后的版本:

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);
    for (int i = 0; i < size; i++)
        list->bucketslots[i] = NULL;
    return list1;
}
mylist\u t*创建列表(整数大小){
mylist_t*list1=malloc(sizeof(mylist_t));
列表->头=0;
列表->尾部=0;
列表->大小=大小;
列表->bucketslots=malloc(大小f(bucket_t*)*size);
对于(int i=0;ibucketslots[i]=NULL;
返回列表1;
}

您建议的
创建列表
分配和初始化结构的替代方案几乎是正确的:

  • list1
    应定义为指向
    mylist\t
    的指针
  • 桶指针的分配应使用指向
    桶的指针的大小,而不是结构
    桶的大小
  • 您还需要初始化bucket指针数组
以下是修改后的版本:

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);
    for (int i = 0; i < size; i++)
        list->bucketslots[i] = NULL;
    return list1;
}
mylist\u t*创建列表(整数大小){
mylist_t*list1=malloc(sizeof(mylist_t));
列表->头=0;
列表->尾部=0;
列表->大小=大小;
列表->bucketslots=malloc(大小f(bucket_t*)*size);
对于(int i=0;ibucketslots[i]=NULL;
返回列表1;
}

有两件事你需要了解

  • 局部变量的范围
  • 全局变量
当您在任何函数中或甚至在链括号语句块中声明变量时,该变量在该代码块之外不存在。您可以将其用作其他函数调用的参数,但如果您尝试在状态之外引用它