Home > database >  Does malloc assigns memory to custom struct's properties?
Does malloc assigns memory to custom struct's properties?

Time:01-22

I've been working on some C projects and was wondering if I create a custom structure, for example, Student, define a variable of the custom structure type, and allocate memory to it using malloc, does it also allocate memory for variables' properties separately or are they all kept in the same space? if yes, will there be any difference if I allocate memory using malloc separately for every property?

For example:

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;
}

CodePudding user response:

That allocates enough memory for the struct, which includes enough memory for ID, first_name, etc and all padding requirements.

Note that while it allocates memory for the pointer first_name, it doesn't allocate a buffer to hold the name. Just the pointer. If you want memory in which to store the names, you will need to allocate it.

If the struct had a char first_name[40]; field, it would be a different story.

CodePudding user response:

No, it doesn't. It allocates uninitialized memory for the number of chars you want - which is usually a calculation based on sizeofs.

If you want it to allocate memory to store values that your struct has pointers to, you'll have to add that after having allocated the memory for the struct.

You'll also have to "go backwards" when you free such a struct.

Example:

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
    }
}

CodePudding user response:

Does it also allocate memory for variables' properties separately

No. After allocating for students, allocate for students->first_name, students->last_name, etc.

  •  Tags:  
  • Related