0

次の関数では、リンクされたリストから文字列を解析し、構造体配列に値を与えています。while ループ内で malloc を使用しないようにする方法はありますか? glibc エラーを処理できないので、他の方法を探しています。構造体フィールドに char* の代わりに char 配列を使用しようとしました。しかし、セグエラーが発生しています。実際には動いているのですが、あと15000回は関数を呼び出さなければならないので、その際にメモリートラブルを起こさないようにしたいです。

struct CoordNode
{
int resNum;
double coordX;
double coordY;
double coordZ;
char atomName[4];     
};
void parseCrdList()
{
int resNum=1;
int tAtomNum,i;
char *tcoordX, *tcoordY, *tcoordZ, *tatomName, tresNum[5]; 
ccur_node=headCoord_node->next;  
struct CoordNode *t;
t=malloc(numofRes*sizeof(struct CoordNode));
i=0;
while (ccur_node!=NULL)
{     
      tresNum=malloc(5*sizeof(char));
      memcpy(tresNum,ccur_node->crdRow+26,4);
      resNum=atoi(tresNum);                  
      t[i].resNum=resNum;
      tcoordX=malloc(8*sizeof(char));
      memcpy(tcoordX,ccur_node->crdRow+35,7);         
      tcoordY=malloc(8*sizeof(char));
      memcpy(tcoordY,ccur_node->crdRow+43,7);       
      tcoordZ=malloc(8*sizeof(char));
      memcpy(tcoordZ,ccur_node->crdRow+51,7);                        
      t[i].coordX=strtod(tcoordX,NULL);
      t[i].coordY=strtod(tcoordY,NULL);
      t[i].coordZ=strtod(tcoordZ,NULL);         
      tatomName=malloc(4*sizeof(char));         
      memcpy(tatomName,ccur_node->crdRow+17,3);        
      strcpy(t[i].atomName,tatomName);        
      old_ccur_node=ccur_node;
      ccur_node=ccur_node->next;
      //free(old_ccur_node);          
      i++;  
}
      numofRes=i;
      addCoordData(t);
      //free(t);
      t=NULL;
}
4

2 に答える 2

0

この機能が役に立ったと言うのは驚くべきことです。私があなたのコードから見たところ、これらの 8 バイトの malloc が揚げられていなかったため、最初から多くのメモリ リークが発生していました。

CoordNode2 つ目は、解析するデータ レコードの実際の数を知る前に、配列を割り当てているように見えることです。numofRes割り当て前に適切な計算を追加しました。

実際にはすべての malloc と memcpy を必要としない入力データを変更しないので、型があると仮定してcrdRowstrtod()すぐに使用できますchar *

最後に、ある場所で割り当てを行い、別の場所でデータを解放することは一般的に悪い習慣です。したがって、headCoord_node構造を解析した後、割り当てられた場所で構造を解放することをお勧めします。解放の決定は、がそのパラメーターtをどのようにaddCoordData(t)扱うかによって異なります。

void parseCrdList()
{
    struct CoordNode *t;
    int i;

    // count number of records to parse
    numofRes = 0;
    ccur_node = headCoord_node->next;
    while (ccur_node != NULL)
    {
        numofRes++;
        ccur_node=ccur_node->next;
    }
    t=malloc(numofRes*sizeof(struct CoordNode));

    i=0;
    ccur_node = headCoord_node->next;
    while (ccur_node!=NULL)
    {     
        t[i].resNum=atoi(ccur_node->crdRow+26);
        t[i].coordX=strtod(ccur_node->crdRow+35,NULL);
        t[i].coordY=strtod(ccur_node->crdRow+43,NULL);
        t[i].coordZ=strtod(ccur_node->crdRow+51,NULL);
        strncpy(t[i].atomName,ccur_node->crdRow+17,4);
        ccur_node=ccur_node->next;
        i++;  
    }
    numofRes=i;
    addCoordData(t);
    //free(t); // <<< it depends on how addCoordData treats t
}
于 2013-11-14T00:43:18.500 に答える