2016-04-17 4 views
0

Ich versuche, eine benachbarte Liste Array in C einzurichten:Kann nicht Index der C-Array Zeiger zugreifen

mygraph->table = (Node *)malloc(MaxSize * sizeof(Node)); 
check(mygraph->table, error); 
int i; 
for(i = 1; i <= MaxSize; i++) 
{ 
    mygraph->table[i].name = NULL; 
    mygraph->table[i].outlist = NULL; 
    mygraph->table[i].outdegree = 0; 
} 
... 

Wenn ich diesen Code ausführen, es funktioniert gut. Aber wenn ich versuche, einen Index in der Tabelle zuzugreifen, erhalte ich einen Segmentation Fault:

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

Ich überprüfte den n Index, und es ist richtig. MaxSize ist 10, aber ich einen Segmentierungsfehler auch erhalten, wenn 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

Haben Sie Speicher für 'name' reserviert? – t0mm13b

Antwort

1

Dies ist der Schlüssel:

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

Es gibt keine Erwähnung der Zuweisung von Speicher für die name Variable.

Auch zuweisen name Variable auf der rechten Seite des Ausdrucks, wäre es besser, anzugeben, indem Sie strncpy oder strdup, um Ihre Absicht zu sagen.

Die onus ist auf Sie, um sicherzustellen, dass Sie in der Tat, free der Speicher durch die name Mitglied auch besetzt.

+0

Wenn die Namensvariable auf der rechten Seite richtig zugewiesen wurde, sollte die Zuweisung gültig sein, aber wenn der ursprüngliche Zeiger später woanders freigegeben wird, gibt es ein Problem. – Ashalynd

+0

In der Tat ist es gültig, aber für den erkennenden Blick, was ist 'name', woher kommt es? Wenn man sich anderswo umschaut, wäre es einfacher, wenn es darauf hindeuten würde, dass es "strcpy" oder "strdup" ist, was mehr in "a-ha, es ist eine Zeigervariable" anzeigt. :) – t0mm13b

+0

Ich versuchte mit strcpy (mygraph-> table [n] .name, name); aber es schlägt immer noch fehl – Alessandro

2

ich einen Segmentation Fault, selbst wenn n = 1 erhalten.

Dies liegt daran, dass Ihr Code ein undefiniertes Verhalten aufweist. Er schreibt über das Ende des Arrays:

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

Wenn n10 ist der Code nicht auf Ihrem System nicht zum Absturz bringen - vielleicht, weil malloc fügt genug Polsterung am Ende des Blocks ein zusätzliches Element über das Ende zur Aufnahme von das Array, aber der Fehler ist immer noch da.

Sie können solche versteckten Fehler unter Verwendung eines Speicherprofilers, z.B. .

Die Lösung ist richtig Indizes in der Initialisierung zu verwenden:

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

Es stürzt für jede Zahl, auch 10 – Alessandro

+0

Ich habe versucht, Ihre Lösung, aber es stürzt immer noch ... Ich werde die Deklaration von Knoten und Graphen – Alessandro

+0

@Alessandro Es ist wahrscheinlich Abstürze an anderer Stelle jetzt, weil dies der Fehler in der ist Code, den Sie gepostet haben. – dasblinkenlight

1

Ihre Schleifen müssen 0-MaxSize-1, wie dies auszuführen:

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

so das erste Element bei mygraph->table[0] sein wird und das letzte Element in
mygraph->table[MaxSize-1] sein wird.

In Zeigerarithmetik, wird das erste Element an mygraph->table beginnen und das letzte Element wird ab:

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

und würden Ende unter:

((mygraph->table) + MaxSize) 

table[MaxSize] entspricht *((mygraph->table) + MaxSize) und das ist außerhalb der Array-Grenzen.

Verwandte Themen