malloc 是否将内存分配给自定义结构的属性?
Does malloc assigns memory to custom struct's properties?
我一直在做一些 C 项目,想知道我是否创建一个自定义结构,例如 Student
,定义一个自定义结构类型的变量,并使用 malloc 为其分配内存,它是否也分别为变量的属性分配内存,还是它们都保存在同一个 space 中?如果是,如果我为每个 属性 分别使用 malloc 分配内存会有什么不同吗?
例如:
typedef struct {
unsigned int ID;
char *first_name;
char *last_name;
int num_grades;
float *grades;
unsigned short int days_absent;
char *memo;
} Student;
int main() {
// Declare students array
Student *students = NULL;
int students_size = 0;
// Allocate memory for students array
students = (Student *) malloc(sizeof(Student));
return 0;
}
Does it also allocate memory for variables' properties separately
没有。为 students
分配后,为 students->first_name
、students->last_name
等分配
这为结构分配了足够的内存,其中包括足够的内存用于 ID
、first_name
等以及所有填充要求。
请注意,虽然它为指针 first_name
分配内存,但它没有分配缓冲区来保存名称。它只是为指针 first_name
分配内存。如果您想要存储名称的内存,则需要分配它。
如果结构有一个 char first_name[40];
字段,那就另当别论了。要为 first_name
分配足够的内存,它需要为 40 char
的数组分配足够的内存,而不是为指针分配足够的内存。这确实提供了一个可以存储字符串的 space。
不,不是。它为你想要的 char
s 的数量分配未初始化的内存——这通常是基于 sizeof
s.
的计算
如果你想让它分配内存来存储你的 struct
有指针的值,你必须在为 struct
.[=17= 分配内存后添加它]
当你free
这样的struct
时,你也必须“倒退”。
示例:
typedef struct {
char *data;
} foo;
foo *foo_create() {
foo *retval = malloc(sizeof *retval ); // try allocation
if(retval == NULL) return NULL; // check that it worked
retval->data = malloc(10) ; // allocate something for a member
if(retval->data == NULL) { // check that it worked
free(retval); // oh, it didn't, free what you allocated
return NULL; // and return something to indicate failure
}
return retval; // all successful
}
void foo_free(foo *elem) {
if(elem != NULL) { // just a precaution
free(elem->data); // free the member's memory
free(elem); // then the memory for the object
}
}
does it also allocate memory for variables' properties separately or are they all kept in the same space?
没有。 malloc()
被赋予一个大小来指示要分配多少连续内存,它 returns 一个指向它的指针... malloc()
对您将要用该指针做什么一无所知.当你将它分配给一个指向 Student
类型的指针变量时,不知何故,用结构来装饰一堆内存。但是您在内部定义的 char *
字段(或者如果您有其他字段指向其他结构化数据)必须单独分配(或者要求更多内存将它们全部分配到同一个返回段中,但是这需要对由此产生的对齐问题进行实践和了解)
我一直在做一些 C 项目,想知道我是否创建一个自定义结构,例如 Student
,定义一个自定义结构类型的变量,并使用 malloc 为其分配内存,它是否也分别为变量的属性分配内存,还是它们都保存在同一个 space 中?如果是,如果我为每个 属性 分别使用 malloc 分配内存会有什么不同吗?
例如:
typedef struct {
unsigned int ID;
char *first_name;
char *last_name;
int num_grades;
float *grades;
unsigned short int days_absent;
char *memo;
} Student;
int main() {
// Declare students array
Student *students = NULL;
int students_size = 0;
// Allocate memory for students array
students = (Student *) malloc(sizeof(Student));
return 0;
}
Does it also allocate memory for variables' properties separately
没有。为 students
分配后,为 students->first_name
、students->last_name
等分配
这为结构分配了足够的内存,其中包括足够的内存用于 ID
、first_name
等以及所有填充要求。
请注意,虽然它为指针 first_name
分配内存,但它没有分配缓冲区来保存名称。它只是为指针 first_name
分配内存。如果您想要存储名称的内存,则需要分配它。
如果结构有一个 char first_name[40];
字段,那就另当别论了。要为 first_name
分配足够的内存,它需要为 40 char
的数组分配足够的内存,而不是为指针分配足够的内存。这确实提供了一个可以存储字符串的 space。
不,不是。它为你想要的 char
s 的数量分配未初始化的内存——这通常是基于 sizeof
s.
如果你想让它分配内存来存储你的 struct
有指针的值,你必须在为 struct
.[=17= 分配内存后添加它]
当你free
这样的struct
时,你也必须“倒退”。
示例:
typedef struct {
char *data;
} foo;
foo *foo_create() {
foo *retval = malloc(sizeof *retval ); // try allocation
if(retval == NULL) return NULL; // check that it worked
retval->data = malloc(10) ; // allocate something for a member
if(retval->data == NULL) { // check that it worked
free(retval); // oh, it didn't, free what you allocated
return NULL; // and return something to indicate failure
}
return retval; // all successful
}
void foo_free(foo *elem) {
if(elem != NULL) { // just a precaution
free(elem->data); // free the member's memory
free(elem); // then the memory for the object
}
}
does it also allocate memory for variables' properties separately or are they all kept in the same space?
没有。 malloc()
被赋予一个大小来指示要分配多少连续内存,它 returns 一个指向它的指针... malloc()
对您将要用该指针做什么一无所知.当你将它分配给一个指向 Student
类型的指针变量时,不知何故,用结构来装饰一堆内存。但是您在内部定义的 char *
字段(或者如果您有其他字段指向其他结构化数据)必须单独分配(或者要求更多内存将它们全部分配到同一个返回段中,但是这需要对由此产生的对齐问题进行实践和了解)