Memoria libre para matriz de estructuras.

Tengo una serie de estructuras que previamente se asigna por malloc. Para liberarlo: gratis (temp) ¿está bien? temp es el nombre de la matriz. ¿O debería liberar elemento por elemento?

Sí. Esta es la función. Bueno, agregué declaraciones de structs.cur_node es una var. De Node. Utilicé Node para crear una lista enlazada. Y lo liberé nodo por nodo.

struct Node { char template_id[6]; double tm_score; double rmsd; double sequence_id; int length; double translation_vector1; double translation_vector2; double translation_vector3; double rotation_matrix1; double rotation_matrix2; double rotation_matrix3; double rotation_matrix4; double rotation_matrix5; double rotation_matrix6; double rotation_matrix7; double rotation_matrix8; double rotation_matrix9; char target_sequence[2000]; char template_sequence[2000]; struct Node *next; }; struct Node *start_node, *cur_node; typedef struct { char *template_id; double tm_score; double rmsd; double sequence_id; int length; double translation_vector1; double translation_vector2; double translation_vector3; double rotation_matrix1; double rotation_matrix2; double rotation_matrix3; double rotation_matrix4; double rotation_matrix5; double rotation_matrix6; double rotation_matrix7; double rotation_matrix8; double rotation_matrix9; char *target_sequence; char *template_sequence; } Node1; void traverseAlignLList() { Node1 *temp; struct Node *old_node; int temp_counter=0; cur_node=start_node; temp=malloc(alignCounter*sizeof(Node1)); while(cur_node!=NULL) { temp[temp_counter].template_id=malloc(6*sizeof(char)); strcpy(temp[temp_counter].template_id,cur_node->template_id); temp[temp_counter].tm_score=cur_node->tm_score; temp[temp_counter].rmsd=cur_node->rmsd; temp[temp_counter].sequence_id=cur_node->sequence_id; temp[temp_counter].length=cur_node->length; temp[temp_counter].translation_vector1=cur_node->translation_vector1; temp[temp_counter].translation_vector2=cur_node->translation_vector2; temp[temp_counter].translation_vector3=cur_node->translation_vector3; temp[temp_counter].rotation_matrix1=cur_node->rotation_matrix1; temp[temp_counter].rotation_matrix2=cur_node->rotation_matrix2; temp[temp_counter].rotation_matrix3=cur_node->rotation_matrix3; temp[temp_counter].rotation_matrix4=cur_node->rotation_matrix4; temp[temp_counter].rotation_matrix5=cur_node->rotation_matrix5; temp[temp_counter].rotation_matrix6=cur_node->rotation_matrix6; temp[temp_counter].rotation_matrix7=cur_node->rotation_matrix7; temp[temp_counter].rotation_matrix8=cur_node->rotation_matrix8; temp[temp_counter].rotation_matrix9=cur_node->rotation_matrix9; temp[temp_counter].target_sequence=malloc(2000*sizeof(char)); strcpy(temp[temp_counter].target_sequence,cur_node->target_sequence); temp[temp_counter].template_sequence=malloc(2000*sizeof(char)); strcpy(temp[temp_counter].template_sequence,cur_node->template_sequence); temp_counter++; old_node=cur_node; cur_node=cur_node->next; free(old_node); } addAlignData(temp); free(temp); //free(cur_node); //free(start_node); start_node=NULL; } 

Supongamos que usted tiene:

  int i, number_of_elements = 15; struct toto **array_toto; array_toto = malloc(sizeof(struct toto*)*number_of_elements); for( i = 0 ; i < number_of_elements; i++) array_toto[i] = malloc(sizeof(struct toto)); 

Tendrías que liberar:

  for( i = 0 ; i < number_of_elements; i++) free(array_toto[i]); free(array_toto); 

de lo contrario, podría desasignar la matriz pero no las estructuras. Sin embargo, asignando con:

  array_toto = malloc(sizeof(struct toto)*number_of_elements); 

Un solo libre lo haría.

Si usó un malloc para asignar la matriz, uno libre es suficiente.

Regla del pulgar, cada malloc requiere un libre!