2017-05-14 8 views
0

構造体内にshapeという配列を追加しようとしましたが、一度追加してメンバvaluesにアクセスしようとすると、セグメント化エラーが発生します。私はそれを削除すると、プログラムは完全に動作します。 構造体内に配列を追加した後のセグメンテーションフォールト(コアダンプ)

COOMatrix coo_matrix_create(int m, int sparse_matrix[][m]){ 
    ... 
    COOMatrix coo; 
    coo = malloc(sizeof(COOMatrix)); 
    coo->rows = malloc(n * m * sizeof(int)); 
    coo->columns = malloc(n * m * sizeof(int)); 
    coo->values = malloc(n * m * sizeof(int)); 
    .... 
    .... 
      coo->rows[k] = i; 
      coo->columns[k] = j; 
      coo->values[k] = sparse_matrix[i][j]; // see Note 
    .... 
    return coo; 
} 

struct coo_matrix{ 
    int nnz; 
    int shape[2]; 
    int * rows; 
    int * columns; 
    int * values; 
}; 
typedef struct coo_matrix * COOMatrix; 

は、これは私がvaluesにアクセスしようとする機能である:私は図形を追加すると、このラインは生産

この

は、構造体の定義でありますセグメンテーション障害。

PS:私はCにあまり慣れていないとは言えません。私は最近C言語に触れる前に他の言語を学びました。

+1

近いことなら 'COOMatrix'と' coo_matrix'は異なるものです。 'typedef'をここに表示していません。 – sjsam

+0

@sjsam私はそれを私の質問に含めるのを忘れてしまった。 –

+0

を追加しました。「typdef」のポインタがあなたを困らせてしまいます。 –

答えて

2

あなたはそのコードにいくつか問題があります。まず、COOMatrixをポインタとして宣言しますが、それを使って基本構造体のサイズを取得することで混乱させます。次に、行、列、および値をintへのポインタとして宣言してから、sizeof(COOMatrix)を使用してそれらを割り当てます。最初のエラーのために、2番目のエラーは実際にはマシンに応じて動作するかもしれませんが、あなたが望むものではありません。だから、

struct coo_matrix{ 
... 
}; 
typedef struct coo_matrix COOMatrix; 
COOMatrix *coo_matrix_create(int m, int sparse_matrix[][m]){ 
    ... 
    COOMatrix *coo; 
    coo = malloc(sizeof(COOMatrix)); 
    coo->rows = malloc(n * m * sizeof(int)); 
    coo->columns = malloc(n * m * sizeof(int)); 
    coo->values = malloc(n * m * sizeof(int)); 
    .... 
    .... 
      coo->rows[k] = i; 
      coo->columns[k] = j; 
      coo->values[k] = sparse_matrix[i][j]; // see Note 
    .... 
    return coo; 
} 

+0

あなたは 'sizeof'について正しいです。それはコピー/ペーストミス* facepalm *でした。私はしばらくの間眠るべきだと思う。 –

+0

リスクを減らすために、 'malloc(sizeof(int)* n * m)'やもっと良い 'malloc(sizeof * coo-> rows * n * m)潜在的な整数オーバーフローの問題、すなわち、数学が 'size_t'型で確実に行われるようにします。 –

+1

@DavidBowlingそれは本当に素晴らしいヒントです! –

関連する問題