0

私のコードは、小さなファイルでエラーなしで実行されます。しかし、大きな入力 (数百万行) でセグメンテーション違反が発生します。以下のコードの一部を参照してください。

element* unionFind(void *data)
{
    element *retVal = NULL;
    retVal = (element *)malloc(sizeof(element));
    retVal->data = data;
    retVal->rank = 0;
    retVal->leader = retVal;
    return retVal;
}

メイン:
...

int main (int argc, char* argv[])
{   
char str[2048]; 
char* v_S = NULL; 
struct set *s_v = NULL;

*入力の行数を数える

long *v_L = (long *)malloc(sizeof(long)*ct_lines);
element **v = malloc(sizeof(element)*ct_lines) ;

while(fgets(str,sizeof(str),fp) != NULL)
{
     v_S = strtok(str,":");        

     v_L[i] = atol(v_S);
         v[i] = unionFind(&v_L[i]);
     s_v = add_vertex(v_L[i], v[i]);

     i++;
}

fclose(fp);

for (i = 0; i < ct_lines; i++) //Here segfault
    {
    free(v[i]); v[i] = NULL;
    }

free(v); v = NULL;
free(v_L); v_L = NULL;

}
4

1 に答える 1

0

各 malloc の後、malloc が NULL を返したかどうかを確認する必要があります (これは、ヒープがいっぱいであるためメモリを割り当てることができなかったことを意味します)。NULL を返す場合、通常はエラー メッセージが出力されます。それでもメモリを割り当てたい場合は、すでに割り当てられているメモリを解放してから再試行する必要があります。

プログラムが大きなファイルで失敗するため、コードを詳細に読み取る必要はありません。空きメモリが不足し、malloc が NULL を返しているため、プログラムは失敗しているに違いありません。次に、最上位関数 findUnion の NULL アドレスに構造要素を保存しようとしています。

于 2013-03-21T09:58:04.023 に答える