2016-10-24 16 views
1

プログラム

多項式係数の文書を読み込み、多項式の根を評価できるプログラムをCで作成しています。「ダブルリンクリストが壊れています」というエラーが表示されるのはなぜですか?

私の関数の1つでは、テキストファイルを読み込み、 "多項式"のリストを作成しようとしています。次のように多項式が定義されている:

typedef struct 
{ 
    unsigned int nterms;  /* number of terms */ 
    double complex *polyCoef; /* coefficients */ 
} polynomial; 

テキストファイルは、各ラインが多項式を表し、各数は係数を表し、次の形式である:

1  0  0  0  2 -1 
16 70 -169 -580 75 
1  0  4  0 -5 
0 -9  3  5 -3 
5 -4  3 -2  0 
1.0 -3.4 5.4531 -4.2077 1.5092 -0.2030 

通報

私は実装の試行で奇妙な動作をしています。次のコードで は、私が手

* `./hw6' でエラー:壊れたダブルリンクリスト:0x0000000000a1c240 *

PolyFile = fopen(argv[2], "r"); 

    if(NULL == PolyFile){ /* If the file fails to open */ 
     fprintf(stderr, "Error: Input file '%s' not found\n", argv[2]); 
     return(-1); 
    } 

    /****** Read in the polynomials *************/ 
    polynomials = malloc(sizeof(polynomial*) * size); /* Initialize */ 

    if(polynomials == NULL){ 
     fprintf(stderr, "%s %i: Could not allocate memory\n", __FILE__, __LINE__); 
     exit(-99); 
    } 

    /* Read all of the data from the file */ 
    while(fgets(String, MAX_STR_LEN, PolyFile)) { 
     strLen = strlen(String); /* Determine size of line */ 

    /* Ensure that the line is not too long */ 
     if(strLen <= MAX_STR_LEN){ 
      /* Create the polynomial */ 
      p = (polynomial*)malloc(sizeof(polynomial)); 

      token = strtok(String, " "); 

      while(token){ 
       coefficients[coeffCount] = token; 
       token = strtok(NULL, " "); 
       coeffCount++; 
      } 
      createPoly(p, coeffCount); 

      /* Set p->polyCoef to the reverse of coefficients */    
      for(int lcv = 0; lcv <= coeffCount - 1; lcv++){ 

       p->polyCoef[lcv] = atof(coefficients[coeffCount - lcv - 1]) + 0.00*I; 
      } 
      coeffCount = 0; 

      polynomials[size] = p; 
      printf("P->NTERMS: %i\n", p->nterms); 
      size++; 

     } else { 
      fprintf(stderr, "%s %i: Line too long. Polynomial ignored\n", 
         __FILE__, __LINE__); 
     } 

    } 
    fclose(PolyFile); 
    /**************************/ 
    for(int j = 0; j <= size - 1; j++){ 
     printf("J: %i\n", j); 
     printf("IN FOR LOOP: %i\n", (polynomials[j])->nterms); 
     // printPoly(polynomials[j]); 
     printf("\n"); 
    } 

。 。 。

/*--------------------------------------------------------------------------- 
    Creates a polynomial data structure with nterms. This allocates storage 
    for the actual polynomial. 

    Where: polynomial *p  - Pointer to polynomial data structure to create 
     unsigned int nterms - The number of elements to create 
    Returns: nothing 
    Errors: prints an error and exits 
---------------------------------------------------------------------------*/ 
void createPoly(polynomial *p, unsigned int nterms){ 
    int lcv; /* loop control variable */ 

    /* Create a polynomial struct */ 
    p->nterms = nterms; 
    p->polyCoef = (double complex*)malloc(sizeof(double complex)*nterms); 

    /* Error out if problem with malloc */ 
    if(p->polyCoef == NULL){ 
    fprintf(stderr, "%s %i:Error allocating memory\n", __FILE__, __LINE__); 
    exit(1); 
    } 

    /* Set the coefficients to 0 */ 
    for(lcv = 0; lcv < nterms; lcv++){ 
    (p->polyCoef)[lcv] = 0.00 + 0.00*I; 
    } 
} 

Iはfclose(PolyFile);を削除する場合、コードが続くが、デバッグ印刷polynomials[0]->ntermsは、ランダム、変更、非常に大きな数に等しいことを示しています。なぜこれが起こっているのか分かりません。これは、適切なサイズの割り当てファイル内の行の数を用いて固定した

polynomials = malloc(sizeof(polynomial*) * size); 

polynomialsの初期化時に、sizeが0に等しかったので

+0

[valgrind](http://valgrind.org)を使用して、このような問題のデバッグを支援します。学習して実行するには数分しかかからず、ほとんどの場合問題を直接指摘できます。 – kaylum

+0

@kaylumはそれがメモリリークの問題であることを示唆していますか? –

+1

いいえ、メモリ破損の可能性が高くなります。 – kaylum

答えて

1

問題が発生しました。

関連する問題