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;
}
有两件事你需要了解
- 局部变量的范围
- 全局变量
当您在任何函数中或甚至在链括号语句块中声明变量时,该变量在该代码块之外不存在。您可以将其用作其他函数调用的参数,但如果您尝试在状态之外引用它