6

以前にmallocによって割り当てられた構造体の配列があります。解放するには: free(temp) is ok? temp は配列の名前です。または要素ごとに解放する必要がありますか?

はい。これは関数です。構造体の宣言を追加しました。cur_node は Node の var です。Node を使用してリンク リストを作成しました。そして、ノードごとに解放しました。

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

2 に答える 2

5

1 つの malloc を使用して配列を割り当てた場合、1 つの解放で十分です。

経験則として、すべての malloc には解放が必要です。

于 2013-11-06T21:37:06.983 に答える
4

あなたが持っていると仮定します:

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

解放する必要があります:

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

それ以外の場合は、構造体ではなく配列の割り当てを解除します。ただし、次のように割り当てます。

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

1回の無料でそれができます。

于 2013-11-06T21:52:01.407 に答える