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_namestudents->last_name 等分配

这为结构分配了足够的内存,其中包括足够的内存用于 IDfirst_name 等以及所有填充要求。

请注意,虽然它为指针 first_name 分配内存,但它没有分配缓冲区来保存名称。它只是为指针 first_name 分配内存。如果您想要存储名称的内存,则需要分配它。

如果结构有一个 char first_name[40]; 字段,那就另当别论了。要为 first_name 分配足够的内存,它需要为 40 char 的数组分配足够的内存,而不是为指针分配足够的内存。这确实提供了一个可以存储字符串的 space。

不,不是。它为你想要的 chars 的数量分配未初始化的内存——这通常是基于 sizeofs.

的计算

如果你想让它分配内存来存储你的 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 * 字段(或者如果您有其他字段指向其他结构化数据)必须单独分配(或者要求更多内存将它们全部分配到同一个返回段中,但是这需要对由此产生的对齐问题进行实践和了解)