2016-04-17 16 views
0

のインデックスにアクセスすることはできません。しかし、私はテーブル内のインデックスにアクセスしようとしたとき、私はセグメンテーションフォールトを取得:は、私はCで隣接リストの配列を設定しようとしています配列ポインタのC

mygraph->table[n].name = name; 

私はnインデックスをチェックし、それが正しいです。 MaxSizeは10ですが、私はn = 1

EDIT場合でも、セグメンテーションフォールトを取得:

typedef struct linkedlist { // linked list of ints (for use in Node) 
    int index; 
    struct linkedlist *next; 
} List; 

typedef struct { // a Node of a Graph 
    char *name; 
    List *outlist; // adjacency list 
    int outdegree; // length of outlist 
    //double pagerank_score; //not needed for this exercise 
} Node; 

typedef struct { 
    // your code goes here 
    int MaxSize;  /*Maximum number of vertices that the graph can constain*/ 
    Node *table;  /*Adjacency lists' array*/ 
} Graph; 
+1

あなたは 'name'にメモリを割り当てましたか? – t0mm13b

答えて

1

これが鍵です:

mygraph->table[n].name = name; 

name変数のためのメモリを割り当てるの言及はありません。

また、式の右辺にname変数を代入すると、strncpyまたはstrdupを使用して、あなたの意図を示すことをお勧めします。

あなたが確かにあなたが確実にするために、freeのメモリがnameのメンバーでも占有されています。

+0

右の名前変数が正しく割り当てられていれば、割り当ては有効ですが、実際には元のポインタが後で別の場所に割り当てが解除された場合は問題があります。 – Ashalynd

+0

確かに、それは有効ですが、目の肥えた目には、「名前」は何ですか、どこから来たのですか?他の場所を見回しているキューでは、それが「strcpy」または「strdup」であることを示す意図があれば、より簡単になります。これは「a-ha、そのポインタ変数」の手掛かりです。 :) – t0mm13b

+0

私はstrcpy(mygraph-> table [n] .name、name)を使ってみました。それでも失敗する – Alessandro

2

は私がしてもn = 1セグメンテーションフォールトを取得します。

これは、コードに未定義の動作があるためです。これは、配列の最後を過ぎて書き込みます:n10とき

for(i = 1; i <= MaxSize; i++) // should be i=0 ; i<MaxSize 

コードがシステム上でクラッシュしない - おそらくmallocための最後過去余分な要素に対応するために、ブロックの最後に十分なパディングを追加配列が、エラーはまだそこにあります。

このような隠れたエラーは、メモリプロファイラを使用して見つけることができます。 valgrind

修正は初期化で正しいインデックスを使用することです:

for(int i = 0 ; i != MaxSize ; i++) { 
} 
+0

それはすべての数値でクラッシュする1 – Alessandro

+0

修正を試みましたがクラッシュしました...ノードとグラフの宣言を投稿します – Alessandro

+0

@Alessandroおそらく他の場所でクラッシュする可能性があります。あなたが投稿したコード – dasblinkenlight

1

あなたのループは次のように、MaxSize-10から実行する必要があります。

for(i = 0; i < MaxSize; i++) 
{ 
    mygraph->table[i].name = NULL; 
    mygraph->table[i].outlist = NULL; 
    mygraph->table[i].outdegree = 0; 
} 

ので、最初の要素はmygraph->table[0]になり、最後の要素は
mygraph->table[MaxSize-1]になります。

は、ポインタ演算では、最初の要素は、 mygraph->tableで開始し、最後の要素は を開始します:で

((mygraph->table) + MaxSize-1) 

となります

((mygraph->table) + MaxSize) 

table[MaxSize]が同等である*((mygraph->table) + MaxSize)これは配列の境界から外れています。